プログラミングをやっていると必ず遭遇するもの、その一つがエラーです。一生懸命書いたプログラムを実行すると、意味の分からない長文が英語で出てきた!このエラーが解決できずに挫折してしまうという方も多いと思います。この記事では、Pythonにおけるエラーの原因と、その解決方法についてお伝えしようと思います。
1. SyntaxError
大抵のプログラミング初学者がまず初めに遭遇するエラーだと思います。一つずつ確認していきましょう。
このエラーは直訳すると「構文エラー」、つまり文法にミスがあるという事です。このエラーが出たら、閉じ括弧)
の付け忘れや、全角スペース、if
文、for
文、while
文におけるコロン:
の書き忘れを疑いましょう。
ここからはいくつか例を挙げて説明をしていきます。
1.1. 括弧を閉じよう!
括弧()
がなかったり、閉じ忘れていたりすると、
SyntaxError: unexpected EOF while parsing
というエラーが出てしまいます。
エラーが出るコード
print("Hello, world!"
# SyntaxError: unexpected EOF while parsing
このコードでは、括弧を閉じ忘れている為に、「予期せぬ文末があります」というエラーが出ています。括弧を閉じてエラーを解消しましょう。
修正後のコード
print("Hello, world!")
# Hello, world!
1.2. 隠れた全角スペースを探そう!
コード中に全角スペースが混ざっていると、
SyntaxError: invalid character in identifier
というエラーが出てしまいます。
エラーが出るコード
r = 2
pi = 3.14
# ^ 分かりづらいですが、ここに全角スペースが入っています(赤の下線が表示されています)
print(r ** 2 * 3.14)
# SyntaxError: invalid character in identifier
全角スペースは見つけづらいですが、エラーに表示される行数line (数字)
をヒントに探して、修正しましょう。
修正後のコード
r = 2
pi = 3.14
print(r ** 2 * 3.14)
# 12.56
1.3. if, for, while文のコロンをつけよう!
if
文、for
文、while
文などの行末に、コロン:
を付け忘れていると、
SyntaxError: invalid syntax
というエラーが出てしまいます。
エラーが出るコード
i = 10
if i == 10
print("iは10です")
else
print("iは10ではありません")
# SyntaxError: invalid syntax
if
, else
それぞれの文末にコロンを付け足せば解決です。
修正後のコード
i = 10
if i == 10:
print("iは10です")
else:
print("iは10ではありません")
# iは10です
2. NameError
これも頻繁にみるエラーです。
このエラーは「呼ばれた変数が見つかりません」というものです。
呼び出した変数を定義しているか、スペルミスをしていないかを確認しましょう。
2.1. 変数の名前を確認しよう!
呼び出した変数が定義されていなかったり、スペルミスをしていたりすると、
NameError: name '変数名' is not defined
というエラーが出てしまいます。
エラーが出るコード
year = 2020
print(Year)
print(month)
# NameError: name 'Year' is not defined
小文字と大文字の区別にも気を付けましょう。プログラムは上から実行されるので、変数month
が定義されていない事は触れられませんが、ここもエラーになります。
修正後のコード
year = 2020
print(year)
# 2020
month = 3
print(month)
# 3
3. TypeError
その名の通り、「型に関するエラー」です。
異なる型の値同士で計算を試みたり、関数の引数に不適切な型を指定すると起こるエラーです。
str()
やint()
を使って変換しましょう。
3.1. 計算部分を確認しよう!
print()
や変数への代入などで計算や文字列の結合をするとき、文字列型str
と数値型int
を同時に使うことはできず、使おうとすると
TypeError: Can't convert '型1' object to (型2) implicitly
というエラーが出てしまいます。
###エラーが出るコード
price = 100
print("この商品は" + price + "円です。")
# TypeError: Can't convert 'int' object to str implicitly
price
にはint
型である100
が代入されているため、str
型と結合することはできません。このような場合はstr()
関数を用いて、price
をstr
型に変換します。
同様に、数値計算においてstr
型をint
型に変換したいときは、int()
関数を用います。
###修正後のコード
price = 100
print("この商品は" + str(price) + "円です。")
# この商品は100円です。
len()
などその他の関数の引数についても同様です。
4. IndentationError
「インデントがおかしいよ」というエラーです。
エディタによっては、インデントが半角スペース2つ分であったり、4つ分であったりと、異なる場合があり、その違いでこのエラーが起こることがあります。他には、if
文でインデント下げをしたその中でelse
の処理をしてしまう事で起こります。
4.1. インデントを確認しよう!
インデントに何らかのミスがあると、
IndentationError: unindent does not match any outer indentation level
というエラーが出てしまいます。
このエラーの対処法はただ一つです。「インデントを確認する」。tab
キーと半角スペース2つが混じっていないかな?など確認しましょう。
###エラーが出るコード
number = 99999
if number % 9 == 0:
print("numberは9の倍数です。")
else:
print("numberは9では割り切れません。")
# ^^ ここは半角スペース2つになっています。
# IndentationError: unindent does not match any outer indentation level
インデントは一つにそろえましょう。また、else
は外に出しましょう。
###修正後のコード
number = 99999
if number % 9 == 0:
print("numberは9の倍数です。")
else:
print("numberは9では割り切れません。")
# numberは9の倍数です。
5. IndexError
リストや文字列を扱っているとちょくちょく出くわします。
「存在しないインデックス番号が指定されているよ」というエラーです。
「インデックス番号は0
から始まる」ということを忘れないようにしましょう。
5.1. インデックス番号を確認しよう!
list
やstr
の要素を指定するとき、存在しないインデックス番号を指定してしまうと
IndexError: (型) index out of range
というエラーが出てしまいます。
###エラーが出るコード
l = ["a","b","c"]
print(l[3])
# IndexError: list index out of range
三番目の要素のインデックス番号は3
ではなく2
になります。最初の要素のインデックス番号は0
であることに注意しましょう。
右端の要素は-1
で指定することもできます。
###修正後のコード
l = ["a","b","c"]
print(l[2])
# c
6. ImportError
標準ライブラリやパッケージをインポートするときに、存在しないモジュールやオブジェクトをインポートしようとすると出るエラーです。スペルミスを確認しましょう。
##6.1. モジュール名を確認しよう!
存在しないモジュール(やfrom import
で指定するオブジェクト)を呼び出すと、
ImportError: No module named '指定したモジュール'
というエラーが出てしまいます。
###エラーが出るコード
import maths
print(maths.sqrt(2))
# ImportError: No module named 'maths'
maths
モジュールは存在しません。math
と書き直しましょう。
修正後のコード
import math
print(math.sqrt(2))
# 1.4142135623730951
###★追記
筆者がPython3.8.2
の環境でエラーが出るコード
を実行したところ、
ModuleNotFoundError: No module named 'maths'
というエラー表示になりました。上のエラーはPython3.4.3
で表示されたため、バージョンによる違いと考えられますが、特に問題はないと思います。
##2020/08/16にこの記事を見直してみた
なんだこの記事は…初心者の癖にイキリ要素しかなくて泣いてしまいました。これからは自分の実力を弁えて記事を書いていこうと思います…(黒歴史程度のものとしてこの記事自体は残しておこうと思います)