よくあるエラー集¶
このノートブックにはPythonを触っていてよく起こりがちなエラーの例をまとめます.
皆さんの手元で起こったエラーの例も共有したいので、ぜひ教えてください
エラーには、いろいろな分類の仕方がありますが代表的なものは以下のとおりです:
構文エラー (syntax error)
ランタイムエラー (runtime error) または 例外 (exception)
論理エラー (logic error)
これらの代表的な例を以下で紹介します。
pythonのようなインタプリタ言語では、実行時にコードの有効性が検証されるため、構文エラーはランタイムエラーとも言えますが、エラーメッセージに従って分類することにします。
構文エラー¶
構文エラーとは、プログラミング言語の文法・構文規則に違反していることによるエラーです。
代表的なものは
括弧や引用符の閉じ忘れ
コロンのつけ忘れ
ピリオドとカンマの間違い
全角記号の使用
=
(代入)と==
(等号)の混同不適切なインデント
などがあります。
引用符のつけ忘れ
print("Hello World)
File "<ipython-input-3-69ef97eb7c7b>", line 1
print("Hello World)
^
SyntaxError: EOL while scanning string literal
括弧の閉じ忘れ
print("Hello World"
File "<ipython-input-4-f5966400ee35>", line 1
print("Hello World"
^
SyntaxError: unexpected EOF while parsing
ピリオドとカンマの間違い
a = [2.2. 3.14] # ほんとはa = [2.2, 3.14]のつもり
File "<ipython-input-10-523925042166>", line 1
a = [2.2. 3.14] # ほんとはa = [2.2, 3.14]のつもり
^
SyntaxError: invalid syntax
コロンのつけ忘れ
for i in range(2)
print(i)
File "<ipython-input-31-47dfaf615d55>", line 1
for i in range(2)
^
SyntaxError: invalid syntax
全角記号の使用
これは見た目では気が付きづらいので、”invalid character”というSyntaxErrorが出たときは、全角を疑うというのもおすすめです。
1+1 #後ろの1が全角になっている
File "<ipython-input-14-0b97842722b1>", line 1
1+1 #後ろの1が全角になっている
^
SyntaxError: invalid character in identifier
1+2 # 和記号+が全角になっている
File "<ipython-input-15-729b19eacfc2>", line 1
1+2
^
SyntaxError: invalid character in identifier
1 + 1 #これはOK
2
1 + 1 #+と後ろの1の間に全角スペースが入っている
File "<ipython-input-17-6a1d737d6e97>", line 1
1 + 1
^
SyntaxError: invalid character in identifier
=(代入)と==(等号)の混同
a = 2.0
b = 3.0
if a = b : #ほんとは==のつもり
print("a equal b!!")
File "<ipython-input-19-b667755dbee2>", line 3
if a = b : #ほんとは==のつもり
^
SyntaxError: invalid syntax
不適切なインデント
下のコードは[予期しないインデント]というエラーがでる。
for i in range(5):
print(i)
for j in range(5): ## この行と次の行のブロックが不要にインデントされている
print(j)
File "<ipython-input-39-47c8681c99ab>", line 3
for j in range(5):
^
IndentationError: unexpected indent
ランタイムエラー¶
ランタイムエラーとは、
書き方そのものはPythonの文法的に誤りではないものの、
実際にコードを実行するとエラーになってしまうものを指します。
非常に多岐に渡りますが、代表的なものとしては、
範囲外参照
定義されていない変数の参照
意図しない変数の型に対する演算
0除算
などがあります。
範囲外参照
要素が2つしかないリストの3番目の要素にアクセスしようとすると、 当然エラーが出ます。
a = [ "いちご", "りんご"]
a[2]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-27-322d2d1c6a18> in <module>()
1 a = [ "いちご", "りんご"]
----> 2 a[2]
IndexError: list index out of range
関数の定義域を超えて引数に入れるのもダメです
import math
math.log(0.0)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-34-f2bde18f41de> in <module>()
1 import math
----> 2 math.log(0.0)
ValueError: math domain error
定義されていない変数の参照
当然、定義されていない変数を使うとエラーが起こります
print(num)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-35-55a60ae9504f> in <module>()
----> 1 print(num)
NameError: name 'num' is not defined
ノートブック特有の注意点
作業途中に定義していた変数がメモリに残っていて、そのおかげで動いているが、 後日作業を再開した際(新しいセッションで実行したとき)にその変数が未定義となり動かなくなる。 といったことも稀に起こります。 とくに、セルを跨いで実行したりするノートブックの編集・実行においては、よく起こるミスです。 こうしたエラーを避けるには、適宜ランタイムやカーネルなどを再起動して、 新しいセッションで実行できるか確認するなどの対策が必要です。
打ち間違いにも注意です
input = "sample_file.txt"
print( imput )
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-28-c91f1af649c8> in <module>()
1 input = "sample_file.txt"
----> 2 print( imput )
NameError: name 'imput' is not defined
意図しない演算
数値と数値の足し算は出来ますが、 数値と文字のように型が異なる変数を足すことはできません。
"私は"+ 200 + "歳です"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-29-bcf55d6c5ba0> in <module>()
----> 1 "私は"+ 200 + "歳です"
TypeError: must be str, not int
和に限らず”演算”は一般に特定の型(同士)のみに定義されています。
また、リスト等の要素にアクセスするのに、
角括弧と間違えて丸括弧を使うミスもよく見られます。
a = [1, 2, 3]
a[1] #これはOK
a(1) #これはNG
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-c7fb72a99bc6> in <module>()
1 a = [1, 2, 3]
2 a[1] #これはOK
----> 3 a(1) #これはNG
TypeError: 'list' object is not callable
0除算
0で割ることはできません
300/ 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-32-a287468d4b9b> in <module>()
----> 1 300/ 0
ZeroDivisionError: division by zero
論理エラー¶
論理エラーとは、文法的にもOK(syntax errorなし)で、ランタイムエラーも無く、最後までプログラムが実行されるが、「意図した通りに動かない」というものを指します。
たとえば「aが負かつ正なら文字列を表示する」という以下のコードは、論理的にはおかしい命令ですが、構文エラーにもランタイムエラーにもなりません
a = 2.0
if a < 0.0 and a > 0.0:
print("aは正かつ負です!!")
人間側のエラーとも言えそうですね。
第1章で説明したように、print文を使ったりしながらこうした論理エラーが無いか調べることもときに必要です。