LoginSignup
3
5

More than 3 years have passed since last update.

もうエラーなんて怖くない! Pythonのエラーとその原因・解決策

Last updated at Posted at 2020-03-16

プログラミングをやっていると必ず遭遇するもの、その一つがエラーです。一生懸命書いたプログラムを実行すると、意味の分からない長文が英語で出てきた!このエラーが解決できずに挫折してしまうという方も多いと思います。この記事では、Pythonにおけるエラーの原因と、その解決方法についてお伝えしようと思います。

1. SyntaxError

大抵のプログラミング初学者がまず初めに遭遇するエラーだと思います。一つずつ確認していきましょう。
このエラーは直訳すると「構文エラー」、つまり文法にミスがあるという事です。このエラーが出たら、閉じ括弧)の付け忘れや、全角スペース、if文、for文、while文におけるコロン:の書き忘れを疑いましょう。
ここからはいくつか例を挙げて説明をしていきます。

1.1. 括弧を閉じよう!

括弧()がなかったり、閉じ忘れていたりすると、
SyntaxError: unexpected EOF while parsing
というエラーが出てしまいます。

エラーが出るコード

hello_world1.py
print("Hello, world!"
# SyntaxError: unexpected EOF while parsing

このコードでは、括弧を閉じ忘れている為に、「予期せぬ文末があります」というエラーが出ています。括弧を閉じてエラーを解消しましょう。

修正後のコード

hello_world2.py
print("Hello, world!")
# Hello, world!

1.2. 隠れた全角スペースを探そう!

コード中に全角スペースが混ざっていると、
SyntaxError: invalid character in identifier
というエラーが出てしまいます。

エラーが出るコード

circle1.py
r = 2
pi = 3.14
# ^ 分かりづらいですが、ここに全角スペースが入っています(赤の下線が表示されています)
print(r ** 2 * 3.14)
# SyntaxError: invalid character in identifier

全角スペースは見つけづらいですが、エラーに表示される行数line (数字)をヒントに探して、修正しましょう。

修正後のコード

circle2.py
r = 2
pi = 3.14
print(r ** 2 * 3.14)
# 12.56

1.3. if, for, while文のコロンをつけよう!

if文、for文、while文などの行末に、コロン:を付け忘れていると、
SyntaxError: invalid syntax
というエラーが出てしまいます。

エラーが出るコード

ten1.py
i = 10
if i == 10
    print("iは10です")
else
    print("iは10ではありません")
# SyntaxError: invalid syntax

if, elseそれぞれの文末にコロンを付け足せば解決です。

修正後のコード

ten2.py
i = 10
if i == 10:
    print("iは10です")
else:
    print("iは10ではありません")
# iは10です

2. NameError

これも頻繁にみるエラーです。
このエラーは「呼ばれた変数が見つかりません」というものです。
呼び出した変数を定義しているか、スペルミスをしていないかを確認しましょう。

2.1. 変数の名前を確認しよう!

呼び出した変数が定義されていなかったり、スペルミスをしていたりすると、
NameError: name '変数名' is not defined
というエラーが出てしまいます。

エラーが出るコード

year1.py
year = 2020
print(Year)

print(month)
# NameError: name 'Year' is not defined

小文字と大文字の区別にも気を付けましょう。プログラムは上から実行されるので、変数monthが定義されていない事は触れられませんが、ここもエラーになります。

修正後のコード

year2.py
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
というエラーが出てしまいます。

エラーが出るコード

price1.py
price = 100
print("この商品は" + price + "円です。")
# TypeError: Can't convert 'int' object to str implicitly

priceにはint型である100が代入されているため、str型と結合することはできません。このような場合はstr()関数を用いて、pricestr型に変換します。
同様に、数値計算においてstr型をint型に変換したいときは、int()関数を用います。

修正後のコード

price2.py
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つが混じっていないかな?など確認しましょう。

エラーが出るコード

nine1.py
number = 99999
if number % 9 == 0:
    print("numberは9の倍数です。")
    else:
      print("numberは9では割り切れません。")
#   ^^ ここは半角スペース2つになっています。
# IndentationError: unindent does not match any outer indentation level

インデントは一つにそろえましょう。また、elseは外に出しましょう。

修正後のコード

nine2.py
number = 99999
if number % 9 == 0:
    print("numberは9の倍数です。")
else:
    print("numberは9では割り切れません。")
# numberは9の倍数です。

5. IndexError

リストや文字列を扱っているとちょくちょく出くわします。
存在しないインデックス番号が指定されているよ」というエラーです。
インデックス番号は0から始まる」ということを忘れないようにしましょう。

5.1. インデックス番号を確認しよう!

liststrの要素を指定するとき、存在しないインデックス番号を指定してしまうと
IndexError: (型) index out of range
というエラーが出てしまいます。

エラーが出るコード

abc1.py
l = ["a","b","c"]
print(l[3])
# IndexError: list index out of range

三番目の要素のインデックス番号は3ではなく2になります。最初の要素のインデックス番号は0であることに注意しましょう。
右端の要素は-1で指定することもできます。

修正後のコード

abc2.py
l = ["a","b","c"]
print(l[2])
# c

6. ImportError

標準ライブラリパッケージをインポートするときに、存在しないモジュールやオブジェクトをインポートしようとすると出るエラーです。スペルミスを確認しましょう。

6.1. モジュール名を確認しよう!

存在しないモジュール(やfrom importで指定するオブジェクト)を呼び出すと、
ImportError: No module named '指定したモジュール'
というエラーが出てしまいます。

エラーが出るコード

math1.py
import maths
print(maths.sqrt(2))
# ImportError: No module named 'maths'

mathsモジュールは存在しません。mathと書き直しましょう。

修正後のコード

math2.py
import math
print(math.sqrt(2))
# 1.4142135623730951

★追記

筆者がPython3.8.2の環境でエラーが出るコードを実行したところ、
ModuleNotFoundError: No module named 'maths'
というエラー表示になりました。上のエラーはPython3.4.3で表示されたため、バージョンによる違いと考えられますが、特に問題はないと思います。

2020/08/16にこの記事を見直してみた

なんだこの記事は…初心者の癖にイキリ要素しかなくて泣いてしまいました。これからは自分の実力を弁えて記事を書いていこうと思います…(黒歴史程度のものとしてこの記事自体は残しておこうと思います)

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5