はじめに
本記事では「構文エラーと例外」(AI Academyに無料登録して頂きましたら購読可能です)のテキストに記載されている12種類のエラーから10種類のエラーを解説します。その他のエラーも知りたい方は是非読んで見てください。
構文エラーと例外の違い
Pythonでは構文エラー(syntax error
)と例外(exception
)の2種類のエラーが存在し、これらは区別されます。構文エラーとは、その字の通り構文として誤りがある場合に発生するエラーで、構文が正しくてもプログラム実行中に発生するエラーは例外と呼びます。「エラー」と「例外」を特に使い分けず、「エラー」と一括りに呼ぶ事もあります。
エラーの種類
構文エラーを含むエラーには、以下のようなものがあります。
・SyntaxError
・IndentationError
・NameError
・TypeError
・ValueError
・AttributeError
・IndexError
・KeyError
・ModuleNotFoundError
・ZeroDivisionError
エラーが発生すると、エラーが発生した行のプログラム以降のコードは実行されません。また、このテキストでは上記のエラーに関して1つ1つ説明していきますが、今の段階では全て覚える必要はありません。太字のエラーを優先的に理解するようにしてみてください。
SyntaxError
SyntaxError
はPythonの構文として正しくない場合に発生するエラーです。コロン:
や()
の閉じ忘れなどがある場合に構文エラーになります。SyntaxError
が発生した場合は、Pythonの構文が間違っていないか確認しましょう。構文エラーになるプログラムは以下の通りです。
for i in range(5)
エラー内容
File "<stdin>", line 1
for i in range(5)
^
SyntaxError: invalid syntax
上記はfor
文の文末に必要な:
が記述されていないため、SyntaxError
が発生しています。
もう1つの構文エラーに関しても確認してみましょう。
print('AI Academy
エラー内容
File "<stdin>", line 1
print('AI Academy
^
SyntaxError: EOL while scanning string literal
上記はprint()
関数の文末に必要な)
の閉じ忘れがあるため、SyntaxError
が発生しています。
IndentationError
IndentationError
は、インデントが正しくない場合に発生するエラーです。IndentationError
が発生した場合は、インデントが正しく行われているか確認しましょう。
a = 10
print(a)
エラー内容
File "<stdin>", line 1
print(a)
^
IndentationError: unexpected indent
上記は2行目のprint(a)
の先頭に余分なスペースが入ってる為、IndentationError
が発生しています。またprint()
関数や変数定義の前に全角スペース、半角スペースが含まれていてもIndentationError
が発生します。
NameError
NameError
は、変数名の間違いや綴間違い(スペスミス)などで、名前が見つからなかった場合のエラーです。Pythonでは、大文字小文字も区別されるため、その場合でもNameError
になります。NameError
が発生した場合は、その変数名が定義されているか、綴り間違いしていないか確認しましょう。
a = 10
print(A)
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'A' is not defined
上記は変数a
を小文字で定義しているのにも関わらず、大文字A
としてprint()
関数の引数に渡している為にNameError
が発生しています。
TypeError
TypeError
は異なるデータ型同士の演算や関数にて処理が行われた場合に発生するエラーです。TypeError
が発生した場合は、演算するデータの型が正しいか確認しましょう。
a = 10
b = 'hello'
a + b
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
上記は変数a
と変数b
がそれぞれ異なったデータ型の演算がされている為にTypeError
が発生しています。
ValueError
ValueError
は型は正しくても、値が適切でない場合に発生するエラーです。ValueError
が発生した場合は関数に渡した値が適切かどうか確認してみましょう。
float('AI Academy')
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'AI Academy'
上記は、float()
の引数に文字列が渡されている為にValueError
が発生しています。ただし、文字列型の数値の場合はエラーは発生しません。
float("10")
出力結果
10.0
AttributeError
AttributeError
は、属性(Attribute)を呼び出す際に発生するエラーです。属性(Attribute)とは、オブジェクトに存在する変数やメソッドのことです。オブジェクトやメソッドに関しては「Python クラスとオブジェクト」(AI Academyに無料登録して頂きましたら購読可能です)にて解説しています。AttributeError
が発生した場合は、オブジェクト名、識別子名は正しいかどうか確認しましょう。具体的には、標準関数dir()
を用いると、そのオブジェクトが対象の変数やオブジェクト(つまり属性)を持ち合わせているか確認出来ます。
a = 10
a.append(20)
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'append'
上記の変数aには、append()
という属性を持ち合わせていないため、AttributeError
が発生しています。dir()
を用いると一覧を確認出来ます。
print(dir(a))
出力結果
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
上記のように変数aにはappend()
が定義されていません。append()
はリスト型で利用できるメソッドですので、以下のようにすれば解決出来ます。
a = [10]
a.append(20)
print(a)
出力結果
[10, 20]
IndexError
IndexError
はリスト型やタプル型に対して、要素数を超えたインデックス値を指定した場合に発生するエラーです。IndexError
が発生した場合は要素数は正しいかを確認し、その上で指定したインデックスが正しいか確認しましょう。
a = [10, 20, 30] # 3つの要素
print(a[3]) # インデックスは0からカウント
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
上記は、範囲外のインデックス「3」を指定したことで、IndexError
が発生しています。インデックス(添字)は0から数えますので、変数a
には0、1、2は指定可能ですが、範囲外のインデックス(4、5、100、5000などを指定するとIndexError
になります。)
KeyError
KeyError
は、辞書型に対してキーを指定して取得する際に、存在しないキーを指定した際に発生するエラーです。KeyError
が発生した場合には、定義した辞書に含まれるキーが正しいかどうか、指定したキーが存在するか確認しましょう。
dic = {"age": 30, "name": "AI太郎"}
dic["email"]
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'email'
キーの一覧を取得するkeys()
メソッドも用意されているので確認が出来ます。
print(dic.keys())
出力結果
dict_keys(['age', 'name'])
ModuleNotFoundError
ModuleNotFoundError
は、読み込んだモジュールが見つからない場合に発生するエラーです。ModuleNotFoundError
が発生した場合は、モジュール名は正しいか、import
しようとしたモジュールがインストールされているか確認してみましょう。
import AI
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'AI'
ZeroDivisionError
ZeroDivisionError
は、数値に対する演算の際に、0で割り算等が行われた場合に発生するエラーです。※割り算等と記載したのは、除算/
だけでなく、整数除算//
、剰余演算%
でも発生するためです。ZeroDivisionError
が発生した場合は、割る数が0になっていないか確認しましょう。
a = 10
print(a / 0) # print(a // 0)でも同様にZeroDivisionErrorが発生します。
エラー内容
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
Pythonを効率よく学ぶには?
Pythonの基本文法やデータ分析の基礎や統計学基礎などの講義テキストはAI Acaddemyの無料アカウントに登録することで、購読可能です。
もっと学びたいと思われた方にAI Academy Bootcampの公式LINEをご紹介します。友だち登録してくださった方に無料講義や無料動画のご案内、受講割引クーポンのプレゼントもございます。
無料で始めるチャンスです!
ではAI・データサイエンス、機械学習の実践力を高める全4コース40時間以上の動画が見放題!AIの学習に必須のPythonの学習から始まり、データサイエンス・機械学習など、目的に応じた幅広い分野をカバーしています。
無料講義や無料動画を試して頂いて、ご受講をご検討頂けましたら幸いです。