【Python】TypeError: can't multiply sequence by non-int of type 'str' エラーの原因と解決方法
Pythonでは、数値同士の掛け算が可能です。さらに、数値と文字列の掛け算もでき、その場合、文字列が指定した回数だけ繰り返された新しい文字列(シーケンス)が返されます。
しかし、文字列同士を掛け算しようとすると、「TypeError: can't multiply sequence by non-int of type 'str'」というエラーが発生します。
本記事では、このエラーの意味と、コード内でどのような場面で発生するのかを解説し、実際のサンプルコードを通じて解決方法を詳しく紹介します。
TypeError: can't multiply sequence by non-int of type 'str' とは
文字列はシーケンス型の一種です。文字列は反復処理可能な文字の集まりであるためです。その他のシーケンス型には、タプル、リスト、辞書などがあります。
乗算演算子(*)を使うと、文字列の内容を繰り返した新しい文字列を作成できます。以下のコードを見てみましょう。
print("Cakes! " * 2)
このコードは「Cakes! Cakes!」を出力します。乗算演算子によって、文字列が2回繰り返される仕組みです。
一方、文字列同士の掛け算に乗算演算子を使用することはできません。同じデータ型同士で掛け算ができるのは、整数と浮動小数点数のみです。Pythonには、2つの文字列を掛け合わせるという概念自体が存在しないためです。
エラーが発生する具体例
ここでは、レストランがある木曜日の午後にジャムスコーンの販売でいくらの売上を記録したかを計算するプログラムを作成してみましょう。
まず、ジャムスコーンの価格を定義します。続いて、input()関数を使って、前日の営業で何個のジャムスコーンを販売したかをユーザーに入力してもらいます。
jam_scone = "1.95"
sold = input("How many jam scones did you sell yesterday? ")
次に、これら2つの値を掛け合わせて、スコーン販売による売上金額を求めます。
earned_from_scones = jam_scone * sold
売上が計算できたら、print()文とformat()メソッドを使って、結果をユーザーに表示します。
print("You earned ${} from selling scones.".format(earned_from_scones))
format()メソッドを使うことで、文字列内の波括弧({})の位置に「earned_from_scones」の値を挿入できます。
さらに、スコーン1個あたりの利益も計算しましょう。1個につき25セントの利益が出るとすると、利益の総額は以下のコードで求められます。
profit = sold * 0.25
print("You made a ${} profit from selling scones.".format(profit))
このコードは、スコーン販売から得られた利益を計算し、その値をコンソールに出力します。それでは、コードを実行して動作を確認してみましょう。
How many jam scones did you sell yesterday? 17 Traceback (most recent call last): File "main.py", line 4, in <module> earned_from_scones = jam_scone * sold TypeError: can't multiply sequence by non-int of type 'str'
コードを実行すると、エラーが発生しました。
解決方法
エラーが発生した行のコードを分析してみましょう。
earned_from_scones = jam_scone * sold
一見するとこの行に問題はないように見えますが、実は重大な問題があります。2つの文字列値を掛け合わせようとしているのです。「jam_scone」は引用符で囲まれた文字列として格納されており、input()関数は常に文字列を返すため、「sold」も文字列値になっています。
この問題を解決するには、「jam_scone」と「sold」の両方を浮動小数点数(float型)にする必要があります。そうすることで、これらの値に対して数学的な演算を実行できるようになります。
そこで、変数の宣言方法を以下のように変更します。
jam_scone = 1.95
sold = float(input("How many jam scones did you sell yesterday? "))
「jam_scone」の値から引用符がなくなりました。これにより、「jam_scone」が文字列から浮動小数点数へと変更されています。また、float()関数を使って、「sold」に入力された値を浮動小数点数に変換しました。
修正後のコードを実行して、結果を確認してみましょう。
How many jam scones did you sell yesterday? 17 You earned $33.15 from selling scones. You made a $4.25 profit from selling scones.
今度はコードが正常に動作しました。まず、プログラムはユーザーに販売したスコーンの個数をコンソールから入力するよう求めます。次に、スコーンの販売で得られた売上金額を計算し、最後にスコーン販売から生じた利益を計算して表示します。
まとめ
「TypeError: can't multiply sequence by non-int of type 'str'」エラーは、2つの文字列値を掛け合わせようとした場合に発生します。この問題を解決するには、以下のいずれかを徹底しましょう。
- 数値同士を掛ける場合は、両方の値をint型またはfloat型に変換する
- 文字列を繰り返したい場合は、整数とのみ掛けるようにする
特にinput()関数の戻り値は必ず文字列になるため、数値として扱いたい場合はint()やfloat()での変換を忘れないことが重要です。これであなたも、Pythonistaのようにこのエラーを自信を持って解決できるはずです!
-
Pythonで変数が文字列型(str)かどうかを判定する方法
isinstance()関数を使った文字列型の判定Pythonでは、組み込み関数 isinstance(var, class) を使うことで、変数 var が指定したクラスのインスタンスであるかどうかを簡単に確認できます。変数が文字列型かどうかを判定したい場合も、この関数を使うのが最も一般的で推奨される方法です。Python 2.x の場合Python 2.x では、str(バイト文字列)と unicode の両方の基底クラスとして basestring が定義されています。そのため、basestring を使えば、どちらの文字列型にも対応した判定が可能です。>>> s =
-
PythonでTypeError例外をキャッチ(捕捉)する方法
PythonにおけるTypeErrorは、互換性のない型のオブジェクト同士を組み合わせた場合や、関数に想定外の型の引数を渡した場合に発生する例外です。例えば、リストと文字列を連結しようとしたり、数値を必要とする処理に文字列を渡したりすると、このエラーが発生します。TypeErrorの主な発生原因異なる型のオブジェクトを演算子で結合・操作した場合(例:リスト + 文字列)関数やメソッドに、期待される型と異なる型の引数を渡した場合整数と文字列など、比較できない型同士を比較した場合try-exceptを使ったTypeErrorの捕捉方法TypeErrorが発生してもプログラムを停止させずに処理を続行