Open In Colab

よくあるエラー集

このノートブックには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が全角になっている
  File "<ipython-input-14-0b97842722b1>", line 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文を使ったりしながらこうした論理エラーが無いか調べることもときに必要です。