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

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

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

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

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

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

## 1.2. 隠れた全角スペースを探そう!
コード中に**全角スペース**が混ざっていると、
**`SyntaxError: invalid character in identifier`**
というエラーが出てしまいます。
### エラーが出るコード

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

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

```python: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`**
というエラーが出てしまいます。
### エラーが出るコード

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

`if`, `else`それぞれの文末にコロンを付け足せば解決です。
### 修正後のコード

```python: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`**
というエラーが出てしまいます。
### エラーが出るコード
```python:year1.py
year = 2020
print(Year)

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

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

```python: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`**
というエラーが出てしまいます。
###エラーが出るコード

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

```

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

```python: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つが混じっていないかな?など確認しましょう。
###エラーが出るコード
```python: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`は外に出しましょう。
###修正後のコード

```python:nine2.py
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`**
というエラーが出てしまいます。
###エラーが出るコード

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

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

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

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

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

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

`maths`モジュールは存在しません。`math`と書き直しましょう。
### 修正後のコード

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

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

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