PythonのTypeErrorとは?意味・原因・直し方を初心者向けに解説

ながみえ

Pythonでプログラムを書いていると、実行したときに「TypeError」というエラーが表示されることがあります。

はじめて見ると少し難しく感じるかもしれませんが、TypeErrorはPython初心者にもよく起こるエラーのひとつです。特に、文字列と数値を一緒に使ったり、関数に渡す値の種類を間違えたりしたときに発生しやすくなります。

この記事では、PythonのTypeErrorの意味、よくある原因、エラーが出たときの直し方を初心者向けにわかりやすく解説します。

Pythonでよく出るエラーをまとめて確認したい場合は、Pythonエラー一覧の記事もあわせて参考にしてください↓↓

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド

TypeErrorとは

TypeErrorとは、Pythonで「データの型に合わない処理」をしたときに発生するエラーです。

ここでいう「型」とは、データの種類のことです。たとえば、Pythonでは文字列、整数、小数、リスト、辞書などがそれぞれ異なる型として扱われます。

代表的な型には、次のようなものがあります。

意味
str文字列“Hello”、”Python”
int整数10、100、-5
float小数3.14、0.5
listリスト[1, 2, 3]
dict辞書{“name”: “田中”, “age”: 20}
NoneType値がないことを表す型None

Pythonでは、型によってできる処理とできない処理があります。

たとえば、整数同士であれば足し算ができます。

num1 = 10
num2 = 20

print(num1 + num2)

このコードでは、num1num2 も整数なので、問題なく計算できます。

一方で、文字列と整数をそのまま足そうとすると、TypeErrorが発生します。

age = 20
message = "私は" + age + "歳です"

print(message)

このコードでは、"私は""歳です" は文字列ですが、age は整数です。Pythonでは、文字列と整数をそのまま + でつなぐことはできません。

そのため、次のようなTypeErrorが表示されます。

TypeError: can only concatenate str (not "int") to str

このエラーは、「文字列には文字列しかつなげられません。整数はそのままつなげられません」という意味です。

修正するには、整数を文字列に変換します。

age = 20
message = "私は" + str(age) + "歳です"

print(message)

str(age) と書くことで、整数の 20 を文字列の "20" に変換できます。これで、文字列同士をつなげる形になるため、TypeErrorは発生しません。

また、Pythonではf文字列を使うと、より読みやすく書くこともできます。

age = 20
message = f"私は{age}歳です"

print(message)

f文字列を使うと、数値を文字列の中に自然に埋め込めます。初心者のうちは、文章の中に変数を入れたいときはf文字列を使うと覚えておくと便利です。

TypeErrorが出たときは、まず「どの値の型が合っていないのか」を確認することが大切です。エラー文の中には、strintlistNoneType などの型名が表示されることが多いので、そこを見ると原因を見つけやすくなります。

TypeErrorが起きる主な原因

TypeErrorは、「型に合わない処理」をしたときに発生します。ただし、実際のコードでは原因がいくつかのパターンに分かれます。

特にPython初心者の場合は、文字列と数値を一緒に使ってしまうケースや、関数に渡す値の種類を間違えてしまうケースがよくあります。

まずは、TypeErrorが起きやすい主な原因を整理して見てみましょう。

原因よくある例確認すること
文字列と数値をそのまま使っている"年齢は" + 20str() で文字列に変換する必要があるか
数値として計算したい値が文字列になっているinput() で受け取った値をそのまま計算するint()float() で数値に変換しているか
関数に渡す値の型が違うlen(100)その関数が受け取れる型か
リストや辞書の使い方を間違えているnumbers(0)()[] を間違えていないか
関数ではないものを呼び出しているname() のように変数を関数のように使うその名前が関数なのか変数なのか
Noneを使って計算しているNone + 10変数に値が入っているか
関数に渡す引数の数が違う引数が必要な関数を引数なしで呼び出す関数の定義と呼び出し方が合っているか

この表の中でも、特に多いのは「文字列と数値をそのまま使っている」ケースです。Pythonでは、見た目が数字のように見えても、文字列として扱われている場合があります。

たとえば、次のようなコードを見てみましょう。

price = "100"
total = price + 50

print(total)

price には "100" が入っています。一見すると数値の100に見えますが、ダブルクォーテーションで囲まれているため、Pythonでは文字列として扱われます。

そのため、文字列の "100" と整数の 50 をそのまま足すことはできません。

この場合は、price を整数に変換してから計算します。

price = "100"
total = int(price) + 50

print(total)

int(price) と書くことで、文字列の "100" を整数の 100 に変換できます。これで数値同士の計算になるため、TypeErrorを防ぐことができます。

また、input() を使うときにも注意が必要です。input() で受け取った値は、数字を入力しても文字列として扱われます。

age = input("年齢を入力してください:")
next_age = age + 1

print(next_age)

このコードでは、ユーザーが 20 と入力しても、age の中身は整数ではなく文字列の "20" になります。そのため、age + 1 の部分で文字列と整数を足そうとして、TypeErrorが発生します。

数値として計算したい場合は、次のように int() を使って変換します。

age = int(input("年齢を入力してください:"))
next_age = age + 1

print(next_age)

このように、TypeErrorを直すときは「今扱っている値が文字列なのか、数値なのか、リストなのか」を確認することが大切です。

型を確認したいときは、type() を使うと便利です。

age = "20"

print(type(age))

実行すると、次のように表示されます。

<class 'str'>

str と表示されているので、age は文字列だとわかります。もし数値として計算したい場合は、int()float() を使って変換する必要があります。

TypeErrorは、エラー文だけを見ると難しく感じるかもしれません。しかし、多くの場合は「型が合っていない場所」を見つければ解決できます。エラーが出た行で使っている変数に、どのような型の値が入っているのかを確認してみましょう。

TypeErrorのエラー例と修正例

ここからは、TypeErrorが発生しやすい具体的なパターンを見ていきます。

TypeErrorは、エラーメッセージの内容によって原因をある程度しぼり込むことができます。

最初は英語のメッセージが難しく感じるかもしれませんが、よくある形を知っておくと、どこを直せばよいか判断しやすくなります。

文字列と数値を足している場合

Python初心者が特によく出会うTypeErrorが、文字列と数値をそのまま + でつなげようとしたときのエラーです。

たとえば、次のようなコードを見てみましょう。

age = 20
message = "私は" + age + "歳です"

print(message)

このコードを実行すると、次のようなエラーが表示されます。

TypeError: can only concatenate str (not "int") to str

このエラーは、「文字列には文字列しかつなげられません」という意味です。

"私は""歳です" は文字列ですが、age は整数です。Pythonでは、文字列と整数をそのまま + でつなげることはできません。

修正するには、str() を使って整数を文字列に変換します。

age = 20
message = "私は" + str(age) + "歳です"

print(message)

このように書くと、age の中身である 20 が文字列として扱われるため、エラーは発生しません。

また、文章の中に変数を入れたい場合は、f文字列を使う方法もおすすめです。

age = 20
message = f"私は{age}歳です"

print(message)

f文字列を使うと、str() を何度も書かなくても、文字列の中に変数を自然に入れることができます。文章を作るときは、こちらの方が読みやすくなることが多いです。

input()で受け取った値を数値として計算している場合

input() を使ったプログラムでも、TypeErrorはよく発生します。

input() はキーボードから入力を受け取るための関数ですが、入力された値はすべて文字列として扱われます。数字を入力した場合でも、自動的に整数になるわけではありません。

たとえば、次のコードを見てみましょう。

price = input("金額を入力してください:")
total = price + 100

print(total)

このコードでは、ユーザーが 500 と入力しても、price の中身は整数の 500 ではなく、文字列の "500" になります。

そのため、price + 100 の部分で、文字列と整数を足そうとしてTypeErrorが発生します。

数値として計算したい場合は、int() を使って文字列を整数に変換します。

price = int(input("金額を入力してください:"))
total = price + 100

print(total)

このようにすると、入力された値を整数に変換してから計算できます。

小数を扱いたい場合は、int() ではなく float() を使います。

price = float(input("金額を入力してください:"))
total = price + 100

print(total)

input() を使って計算する場合は、「入力された値はまず文字列になる」と覚えておくと、TypeErrorを防ぎやすくなります。

ただし、int()float() で変換できない文字を入力すると、今度はValueErrorが発生します。たとえば、int("abc") のような変換はできません。TypeErrorとあわせて、ValueErrorもよく出るエラーとして覚えておくとよいでしょう。

len()に数値を渡している場合

len() は、文字列やリストなどの長さを調べるための関数です。

しかし、整数のように「長さ」を持たない値に対して len() を使うと、TypeErrorが発生します。

たとえば、次のコードを見てみましょう。

number = 100

print(len(number))

このコードを実行すると、次のようなエラーが表示されます。

TypeError: object of type 'int' has no len()

これは、「int型のオブジェクトには長さがありません」という意味です。

整数の 100 は数値なので、文字数や要素数を数えることはできません。そのため、len() の対象としては使えません。

文字列の長さを調べたい場合は、次のように文字列を渡します。

text = "100"

print(len(text))

この場合、"100" は文字列なので、文字数を数えることができます。実行すると 3 と表示されます。

リストの要素数を調べたい場合は、次のように書きます。

numbers = [10, 20, 30]

print(len(numbers))

この場合は、リストの中に要素が3つあるため、3 と表示されます。

len() を使うときは、その値が「長さを数えられるものか」を確認しましょう。文字列、リスト、タプル、辞書などには使えますが、整数や小数には使えません。

リストや整数を関数のように呼び出している場合

リストの要素を取り出すときに、[] ではなく () を使ってしまうと、TypeErrorが発生します。

たとえば、次のコードを見てみましょう。

numbers = [10, 20, 30]

print(numbers(0))

このコードを実行すると、次のようなエラーが表示されます。

TypeError: 'list' object is not callable

このエラーは、「list型のオブジェクトは関数のように呼び出せません」という意味です。

Pythonでは、() は関数を呼び出すときに使います。一方で、リストの要素を取り出すときは [] を使います。

そのため、次のように修正します。

numbers = [10, 20, 30]

print(numbers[0])

このコードでは、リスト numbers の0番目の要素を取り出しています。実行すると 10 と表示されます。

同じように、整数を関数のように呼び出した場合もTypeErrorになります。

number = 10

print(number())

このコードでは、number は整数です。しかし、number() と書いているため、Pythonは number を関数として呼び出そうとします。

その結果、次のようなエラーが発生します。

TypeError: 'int' object is not callable

このようなエラーが出たときは、変数の後ろに不要な () を付けていないか確認しましょう。

また、リストや辞書から値を取り出すときは、() ではなく [] を使うことを意識するとよいです。

Noneを使って計算している場合

None は、「値がない」ことを表す特別な値です。

数値ではないため、None を使って足し算や引き算などの計算をしようとすると、TypeErrorが発生します。

たとえば、次のコードを見てみましょう。

score = None
total = score + 10

print(total)

このコードを実行すると、次のようなエラーが表示されます。

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

これは、「NoneTypeとintは + で計算できません」という意味です。

score には数値ではなく None が入っています。そのため、score + 10 のような計算はできません。

最初から数値として扱いたい場合は、None ではなく 0 などの数値を入れておきます。

score = 0
total = score + 10

print(total)

また、値が入っているかどうかを確認してから計算する方法もあります。

score = None

if score is not None:
    total = score + 10
    print(total)
else:
    print("点数がありません")

このように書くと、scoreNone の場合は計算せず、別の処理を実行できます。

関数の戻り値を使って計算している場合にも、None が原因でTypeErrorになることがあります。関数が本当に数値を返しているかどうかも確認してみましょう。

関数に渡す引数の数や型が違う場合

関数を使うときにも、TypeErrorが発生することがあります。

特に、関数に必要な引数を渡していない場合や、反対に多く渡しすぎている場合にTypeErrorが表示されます。

たとえば、次のコードを見てみましょう。

def greet(name):
    print(name + "さん、こんにちは")

greet()

このコードでは、greet() 関数を定義しています。greet() は、name という引数を1つ受け取る関数です。

しかし、呼び出すときに何も渡していません。そのため、次のようなエラーが発生します。

TypeError: greet() missing 1 required positional argument: 'name'

これは、「greet() を実行するには、name という引数が1つ必要です」という意味です。

修正するには、関数を呼び出すときに必要な値を渡します。

def greet(name):
    print(name + "さん、こんにちは")

greet("田中")

これで、name"田中" が入り、正しく実行できます。

反対に、引数を多く渡しすぎてもTypeErrorになります。

def greet(name):
    print(name + "さん、こんにちは")

greet("田中", "佐藤")

このコードでは、greet() は引数を1つだけ受け取る関数なのに、2つの値を渡しています。そのため、次のようなエラーが発生します。

TypeError: greet() takes 1 positional argument but 2 were given

関数に関するTypeErrorが出たときは、関数の定義と呼び出し方を見比べることが大切です。

確認するポイントは、次の3つです。

  1. 関数に必要な引数を渡しているか
  2. 引数を多く渡しすぎていないか
  3. 関数が想定している型の値を渡しているか

関数のTypeErrorは、最初は少し読みにくく感じるかもしれません。しかし、エラーメッセージには「何個の引数が必要なのか」「何個渡されたのか」が書かれていることが多いです。

エラー文をよく見ると、修正すべき場所を見つけやすくなります。

TypeErrorに関するよくある質問

ここでは、PythonのTypeErrorについて初心者が疑問に思いやすい内容をQ&A形式で整理します。

TypeErrorは、原因のパターンを知っておくと解決しやすいエラーです。エラー文の意味がわからないときは、まずここで紹介する内容に当てはまらないか確認してみてください。

TypeErrorはどういう意味ですか?

TypeErrorは、データの型に合わない処理をしたときに発生するエラーです。

たとえば、文字列と整数をそのまま足したり、整数に対して len() を使ったりするとTypeErrorになります。

age = 20
message = "年齢は" + age + "歳です"

print(message)

このコードでは、文字列と整数を + でつなげようとしているため、TypeErrorが発生します。

修正するには、整数を文字列に変換します。

age = 20
message = "年齢は" + str(age) + "歳です"

print(message)

TypeErrorが出たときは、「この処理に使っている値の型は合っているか」を確認することが大切です。

TypeError: can only concatenate strとは何ですか?

TypeError: can only concatenate str (not "int") to str は、文字列に文字列以外の値を + でつなげようとしたときに出るエラーです。

concatenate は「つなげる」という意味です。つまり、このエラーは「文字列には文字列しかつなげられません」という内容を表しています。

たとえば、次のコードではTypeErrorが発生します。

name = "田中"
age = 20

print(name + "さんは" + age + "歳です")

name"さんは" は文字列ですが、age は整数です。そのため、+ でそのままつなげることはできません。

修正するには、str() を使う方法があります。

name = "田中"
age = 20

print(name + "さんは" + str(age) + "歳です")

また、f文字列を使うとさらに読みやすく書けます。

name = "田中"
age = 20

print(f"{name}さんは{age}歳です")

文章の中に変数を入れたい場合は、f文字列を使うとTypeErrorを防ぎやすくなります。

input()を使うとTypeErrorになるのはなぜですか?

input() で受け取った値は、数字を入力しても文字列として扱われるためです。

たとえば、次のコードを見てみましょう。

number = input("数字を入力してください:")
answer = number + 10

print(answer)

ユーザーが 5 と入力しても、number の中身は整数の 5 ではなく、文字列の "5" になります。そのため、number + 10 の部分で文字列と整数を足そうとして、TypeErrorが発生します。

数値として計算したい場合は、int() を使って整数に変換します。

number = int(input("数字を入力してください:"))
answer = number + 10

print(answer)

小数を扱いたい場合は、float() を使います。

number = float(input("数字を入力してください:"))
answer = number + 10

print(answer)

input() を使って計算するときは、「入力された値はまず文字列になる」と覚えておくとよいです。

TypeErrorが出たら最初に何を確認すればよいですか?

TypeErrorが出たら、まずエラーメッセージの最後の行を確認しましょう。

最後の行には、次のようにエラーの種類と原因のヒントが表示されます。

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

この場合は、NoneTypeint という型名が出ています。つまり、None と整数を + で計算しようとしていることが原因だと考えられます。

次に、エラーが出ている行で使っている変数の型を確認します。型を調べたいときは、type() を使います。

score = None

print(type(score))

実行すると、次のように表示されます。

<class 'NoneType'>

このように、変数の型を確認すると、なぜTypeErrorが出ているのかを見つけやすくなります。

TypeErrorが出たときは、次の順番で確認するとよいです。

  1. エラーメッセージの最後の行を見る
  2. 表示されている型名を確認する
  3. エラーが出ている行の変数を確認する
  4. type() で変数の型を調べる
  5. 必要に応じて str()、int()、float() で変換する

最初からすべてを理解しようとしなくても大丈夫です。まずは、エラー文に出てくる strintlistNoneType などの型名に注目するところから始めましょう。

まとめ|TypeErrorは型の違いを順番に確認しよう

TypeErrorは、Pythonでデータの型に合わない処理をしたときに発生するエラーです。

特に、文字列と数値をそのまま + でつなげている場合や、input() で受け取った値を数値に変換していない場合によく起こります。また、len() に整数を渡したり、リストを () で呼び出したり、None を使って計算したりした場合にもTypeErrorが発生します。

TypeErrorが出たときは、まずエラーメッセージの最後の行を確認しましょう。そこに表示されている strintlistNoneType などの型名を見ると、原因を見つけやすくなります。

変数の型がわからないときは、type() を使って確認できます。必要に応じて、str()int()float() などで型を変換しましょう。

TypeErrorは最初は難しく見えますが、「どの値の型が合っていないのか」を順番に確認すれば、少しずつ自分で直せるようになります。

Pythonでよく出るエラーをまとめて確認したい方は、Pythonエラー一覧の記事も参考にしてみてください↓↓

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド
記事URLをコピーしました