PythonのTypeErrorを撃退!「型が違います」エラーのやさしい倒し方
こんにちは!この記事を書いている僕は、ほんの数ヶ月前までプログラミングの「プ」の字も知らない、完全な初心者でした。そんな僕がAIの力を借りながら、今では2つのWebサイトを運営しています。
プログラミング学習中、誰もが一度は遭遇するであろう、あの赤文字のエラーメッセージ。特に「TypeError」は、最初のうちは本当に意味が分からなくて、心が折れそうになりますよね。僕もそうでした。
でも、安心してください。この記事では、僕が実際につまづいた経験をもとに、「TypeErrorとは何か?」そして「どうすれば解決できるのか?」を、専門用語をできるだけ使わずに、世界一やさしく解説します。この記事を読み終える頃には、あなたはTypeErrorを恐れるどころか、解決へのヒントをくれる「味方」だと思えるようになっているはずです!
そもそも「TypeError」って、なに?🤔
さっそくですが、クイズです。次の計算はできるでしょうか?
「数字の 10」 + 「文字の "円"」
直感的に「10円」ってなりそうですよね。では、これはどうでしょう?
「数字の 10」 + 「文字の "りんご"」
...これは計算できませんよね。「10りんご」?意味が分かりません。
実は、Pythonもこれと全く同じことで悩んでいます。Pythonにとって、数字(専門用語で `int` や `float`)と文字(専門用語で `str`)は、全くの別人です。人間が「数字の10」と「文字の"りんご"」を足せないのと同じように、Pythonも種類の違うデータを混ぜて計算しようとすると、「どの種類(型)で計算すればいいか分からないよ!」とパニックを起こしてしまいます。
この「型の違いによるパニック」こそが、`TypeError`の正体です。エラーメッセージは、「ご主人様!計算しようとしているデータの型(Type)が違うので、エラー(Error)です!」と私たちに教えてくれている、親切なサインなんです。
【実践】よくあるTypeErrorを体験して、倒してみよう!
理屈はなんとなく分かったところで、さっそく実際のコードで`TypeError`を体験し、それを解決するプロセスを見ていきましょう。このステップバイステップを真似するだけで、あなたもエラー解決のコツが掴めます。
ケース1:数字と文字を「+」で繋ごうとした場合
まずは、一番よくあるパターンです。年齢を表す文章を作ろうとして、次のようなコードを書いたとします。
❌ エラーが起こるコード
このコードをコピーして実行すると、`TypeError`が発生します。
age = 30
print("私の年齢は" + age + "歳です。")
# 実行結果:
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: can only concatenate str (not "int") to str
出ましたね、`TypeError`。エラーメッセージの最後を見てみましょう。TypeError: can only concatenate str (not "int") to str
これは、「`str`(文字)には`str`(文字)しか連結(concatenate)できませんよ!(`int`(数字)じゃなくてね)」という意味です。Python君が「"私の年齢は" という文字と、数字の `30` は直接足せません!」と教えてくれているわけです。
🕵️♂️ 原因調査:本当に型が違うのか確認しよう
エラーの原因が「型の違い」だと分かりました。では、本当にそうなのか、Pythonに直接聞いて確かめてみましょう。変数の型を調べるには、`type()`という便利な関数を使います。
text = "私の年齢は"
age = 30
print( type(text) )
print( type(age) )
# 実行結果:
# <class 'str'>
# <class 'int'>
ご覧の通り、`text`は文字である`str`、`age`は数字である`int`だと分かりました。これで、型が違うことが確定しましたね。
✅ 解決策①:数値を文字列に変身させる `str()`
原因が分かれば、あとは簡単です。数字である`age`を、文字に変身させてあげればいいのです。そのための魔法が `str()` 関数です。変数を`str()`で囲むだけで、どんな型でも文字列に変換できます。
age = 30
# str()を使って、数値のageを文字列に変換!
print("私の年齢は" + str(age) + "歳です。")
# 実行結果:
# 私の年齢は30歳です。
やりました!エラーが出ずに、正しく表示されましたね。これが`TypeError`の基本的な倒し方です。
✅ 解決策②(推奨):f-stringでスマートに解決!
`str()`でも解決できますが、もっとモダンで読みやすい方法があります。それが「f-string」です。
文字列の最初のクォーテーションの前に `f` を付け、変数名を `{}` で囲むだけ。これだけで、Pythonが自動的に変数をいい感じに文字に変換して埋め込んでくれます。`+` で繋ぐ必要も、`str()` で変換する必要もありません。
age = 30
# f-stringを使うと、こんなにスッキリ!
print(f"私の年齢は{age}歳です。")
# 実行結果:
# 私の年齢は30歳です。
どうですか?こちらのほうがコードが短く、直感的で分かりやすいですよね。これから文字列と変数を組み合わせるときは、f-stringを使うことを強くおすすめします!
ケース2:ユーザー入力の罠 `input()`
Webサイトやアプリでは、ユーザーに何かを入力してもらう場面がたくさんあります。Pythonでユーザーからの入力を受け取るには`input()`関数を使いますが、ここには大きな落とし穴があります。
❌ エラーが起こるコード
ユーザーに生まれた年を入力してもらい、現在の年齢(2025年時点)を計算するコードを書いてみましょう。
birth_year = input("あなたが生まれた年を西暦で入力してください: ")
age = 2025 - birth_year
print(f"あなたの年齢は{age}歳ですね!")
# 実行(例えば 1995 と入力):
# あなたが生まれた年を西暦で入力してください: 1995
#
# 実行結果:
# Traceback (most recent call last):
# File "<stdin>", line 2, in <module>
# TypeError: unsupported operand type(s) for -: 'int' and 'str'
またしても`TypeError`です。今度のメッセージはunsupported operand type(s) for -: 'int' and 'str'。「`-`(引き算)の計算では、`int`(数字)と`str`(文字)の組み合わせはサポートしていませんよ」と言っています。
「え? 1995って入力したのに、なんで文字なの?」と思いますよね。ここが重要です。
`input()`関数で受け取った値は、たとえ数字のように見えても、すべて文字列 (`str`) として扱われます。
これはPythonの絶対的なルールなので、覚えてしまいましょう。`type()`で確認すれば一目瞭然です。
birth_year = input("あなたが生まれた年を西暦で入力してください: ")
print(f"入力されたデータの型は: {type(birth_year)} です。")
# 実行(例えば 1995 と入力):
# あなたが生まれた年を西暦で入力してください: 1995
#
# 実行結果:
# 入力されたデータの型は: <class 'str'> です。
✅ 解決策:文字列を数値に変身させる `int()`
原因は、`input()`のせいで`birth_year`が文字列 (`str`) になってしまっていることでした。計算するためには、これを数値 (`int`) に変身させる必要があります。
そこで使うのが `int()` 関数です。`str()`の逆ですね。`input()`で受け取った値をまるごと`int()`で囲んであげましょう。
# input()の結果を、すぐにint()で数値に変換!
birth_year_str = input("あなたが生まれた年を西暦で入力してください: ")
birth_year_int = int(birth_year_str)
age = 2025 - birth_year_int
print(f"あなたの年齢は、およそ{age}歳ですね!")
# 実行(例えば 1995 と入力):
# あなたが生まれた年を西暦で入力してください: 1995
#
# 実行結果:
# あなたの年齢は、およそ30歳ですね!
見事に計算できました! `input()` を使ったら、計算の前に `int()` で変換する。このセットを覚えておけば、もう怖くありません。
【AI時代の学習法】TypeErrorはAIに聞いちゃおう!
僕がプログラミング初心者を短期間で抜け出せたのは、AIを相棒にしたからでした。エラーメッセージが出ても、焦る必要はありません。今は、優秀なAIアシスタントがいつでも隣にいてくれます。
エラーが出たら、「エラーが出たコード」と「表示されたエラーメッセージ全文」をコピーして、次のようにAIに質問してみてください。
【魔法のプロンプト(質問文)】
Pythonで以下のコードを実行したところ、次のエラーが出ました。
このエラーの原因と解決策を、プログラミング初心者にも分かりやすく、具体例を交えて教えてください。
▼コード
```python
# ここにエラーが出たあなたのコードを貼り付ける
age = 30
print("私の年齢は" + age + "歳です。")
```
▼エラーメッセージ
```
# ここに表示されたエラーメッセージを全文貼り付ける
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
```
このように質問すれば、AIは「なぜエラーが起きたのか」「どうすれば直るのか」を、この記事で解説したように丁寧に教えてくれるはずです。エラーを解決のチャンスに変える、最高の学習ツールとしてAIをどんどん活用しましょう!
まとめ:TypeErrorは友達🤝
今回は、多くの初心者がつまずく`TypeError`について、その正体と倒し方を解説しました。最後に、大事なポイントをおさらいしましょう。
- TypeErrorの原因:種類の違うデータ(型)を混ぜて計算しようとしたため。
- まずやるべきこと:怪しい変数を `type()` 関数で調べて、型を確認する。
- 解決策:`str()` や `int()` を使って、型を揃えてあげる(型変換)。
- `input()`のルール:`input()`で受け取った値は、常に文字列 (`str`)になる。
- おすすめの書き方:文字列と変数を組み合わせるときは、`f-string`が断然ラクで読みやすい。
- 最強の味方:エラーが出たら、コードとエラー文をAIにコピペして聞く!
エラーは、あなたのコードの間違いを教えてくれる親切なヒントです。`TypeError`が出たら、「OK、型の確認タイムだな」と思えるようになれば、あなたはもう初心者卒業です。これからもたくさんのエラーに出会うと思いますが、一つ一つ解決していくことで、確実にレベルアップできます。応援しています!
次のステップへ
`TypeError`をマスターしたあなたへ。次は、ファイルの読み書きなどでよく遭遇する、もう一つの厄介なエラー「文字化け」に挑戦してみませんか?原因が分かれば、これも怖くありません。
次の記事へ: UnicodeDecodeErrorが出るときの対処方法(文字化け)»