01 / 07
エラーは報告書
コードを動かして知らない文字がどっと出ると、こわく感じるかもしれない。でもあれは怒られているのではなくて、Pythonからの報告書だよ。
報告書のいちばん大事なところは最後の1行。NameError: name 'namae' is not defined のように、「種類: 本文」という形で書かれている。
このレッスンでは、まず種類の名前だけを覚えよう。名前を見ただけで「ああ、あれか」と見当がつくようになると、詰まっている時間がぐっと短くなるよ。
まちがいと向き合う
INPUT · スライド
01 / 07
コードを動かして知らない文字がどっと出ると、こわく感じるかもしれない。でもあれは怒られているのではなくて、Pythonからの報告書だよ。
報告書のいちばん大事なところは最後の1行。NameError: name 'namae' is not defined のように、「種類: 本文」という形で書かれている。
このレッスンでは、まず種類の名前だけを覚えよう。名前を見ただけで「ああ、あれか」と見当がつくようになると、詰まっている時間がぐっと短くなるよ。
02 / 07
知らない名前を使ったときに出るエラーだよ。だいたいは打ちまちがいか、変数を作る前に使ってしまったときだね。
下の例では namae という名前で作ったのに、namea と呼んでいる。Pythonは正直なので「namea なんて名前は聞いていない」と言うんだ。
is not defined は「定義されていない」という意味。つづりと、作った順番を疑おう。
namae = "あおい"print(namea)実行結果
NameError: name 'namea' is not defined. Did you mean: 'namae'?
03 / 07
種類(型)の合わないものを組み合わせたときに出るよ。文字と数を + でつなごうとするのが代表例だね。
Pythonは「文字に足せるのは文字だけ」と考えるので、300 をそのままつなげない。str(300) で文字に変えるか、f文字列を使えば直るよ。
print("ねだん: " + 300)実行結果
TypeError: can only concatenate str (not "int") to str
04 / 07
リストの無い番号を取りに行くと出る。要素が3つなら使える番号は 0 1 2 まで。3 はもう無いよ。
list index out of range は「番号が範囲の外」という意味。len() より1つ小さいところまで、と覚えておこう。
kudamonos = ["りんご", "みかん", "ぶどう"]print(kudamonos[3])実行結果
IndexError: list index out of range
05 / 07
辞書に入っていないキーを引くと出るよ。本文には引こうとしたキーがそのまま出てくるので、どれをまちがえたのかすぐ分かる。
リストなら IndexError、辞書なら KeyError。入れものの種類でエラーの名前が変わるところが面白いね。
nedans = {"りんご": 120, "みかん": 80}print(nedans["ぶどう"])実行結果
KeyError: 'ぶどう'
06 / 07
種類は合っているのに、中身の形が合わないときに出る。int("abc") がその代表だよ。
int() は文字を数に変える道具。文字を渡すところまでは正しいけれど、"abc" は数の形をしていない。だから「その値ではむり」と言われるんだ。
TypeError は種類がちがう、ValueError は種類は合っているが中身がだめ。ここが見分けどころだよ。
print(int("abc"))実行結果
ValueError: invalid literal for int() with base 10: 'abc'
07 / 07
もう1つ、ZeroDivisionError も見ておこう。0で割ったときに出る。人数が0人のときに割り勘を計算してしまう、というのがありがちな形だね。
名前と原因を並べておくよ。
| 名前 | 何が起きたか |
|---|---|
NameError | 知らない名前を使った |
TypeError | 種類の合わないものを組み合わせた |
IndexError | リストの範囲外の番号を取りに行った |
KeyError | 辞書に無いキーを引いた |
ValueError | 種類は合うが中身の形がだめ |
ZeroDivisionError | 0で割った |
この6つで、初学者が出すエラーの大半は説明がつく。次は、この1行と一緒に出てくる長い文字の読み方だよ。
print(10 / 0)実行結果
ZeroDivisionError: division by zero