プログラミングの勉強を始めると、かならず直面する大きな問題が「エラー」です。
エラーはプログラミング初心者のみならず、上級者になっても色々な場面で遭遇するもので、プログラミングをやっていく上ではつきものだと言えます。
けれども、プログラミングに入門したての初心者には乗り越えがたい大きな壁になることも多く、エラーを解消できずに心が折れてしまい、挫折してしまう人が多いのも事実です。
プログラミング初心者にとってエラーが解消しづらい原因はさまざまですが、大きな理由としてはエラーメッセージが英語であること、そして相談する相手がいないことなどが挙げられます。
そこで、今回の記事ではプログラミング初心者がよく遭遇するエラーの原因と解消方法を日本語で詳しく解説していきます。
SyntaxError: invalid syntax
このエラーが起こるときは、Pythonの文法に誤りがある場合です。
かならずどこかに文法の誤りがあるので、エラーメッセージに表示されている付近のコードをもうもう一度見直してみてください。
このエラーは、たとえば以下のようなときに発生します。
「1 ++」という記法はPythonには無いため、エラーが発生します。
1 ++
File "<stdin>", line 1
1 ++
^
SyntaxError: invalid syntax
ですので、この部分を正しい文法で書き直すとエラーが解消します。
1 + 1
2
SyntaxError: EOL while scanning string literal
このエラーは、文字列型データの入力に誤りがあるときに発生します。
Pythonで文字列型のデータを入力するとき、半角の「”」や「’」で文字列を囲みますが、これの入力を忘れているケースが多かったりします。
このエラーは、例えば以下のようなときに発生します。
見ての通り、太郎の後ろの「”」が無く、文字列が閉じられていませんね。
myneme = "太郎
File "<stdin>", line 1
myname = "太郎
^
SyntaxError: EOL while scanning string literal
そして、日本語をPythonで扱っているとよくやってしまうのが、後ろの「”」を全角の「”」にしてしまっていて気づかないというやつです。
全角の「”」は文字として扱われるため、文字列を閉じる記号には使えないのです。
こんな感じですね。太郎のうしろの「”」が全角になっているのがおわかりでしょうか。
これは、ひと目見ただけではわかりにくいため、非常に見つけにくいエラーだと思います。
myname = "太郎”
File "<stdin>", line 1
myname = "太郎”
^
SyntaxError: EOL while scanning string literal
このエラーを解消するためには、文字列の前と後ろをしっかりと半角の「”」か「’」で書くことが必要です。
myname = "太郎"
NameError: name ‘NAME’ is not defined
このエラーは、定義されていない変数や関数を呼び出そうとしたときに発生します。
「NAME」の部分には、あなたが呼び出そうとした変数名や関数名が表示され、その変数や関数は定義されていないことを示しています。
このように、定義されていない変数や関数を呼び出そうとすると発生します。
NAME
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'NAME' is not defined
このエラーを解消するためには、その変数や関数を定義してあげると解消します。
NAME = 'お名前'
NAME
'お名前'
IndentationError: expected an indented block
このエラーは、インデントを適切に入力していない場合に発生します。
インデントを入れるべき場所に適切にインデントを入力すればこのエラーは解消します。
このエラーが発生するのは、たとえば以下のような場合です。
Pythonでは「def」で関数を定義したあと、処理内容の部分はインデントを入れて一段下げなければなりません。
ところが、この例では「print(‘foo’)」の処理内容部分が一段下がっておらず、インデントが入っていないことがわかります。
def function():
print('foo')
File "<stdin>", line 2
print('foo')
^
IndentationError: expected an indented block
このようにインデントを適切に入れることで、このエラーは解消します。
def function():
print('foo')
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
このエラーは、数値型のデータと文字列型のデータを計算しようとしたときに発生します。
たとえばよくあるのが、文字列型の数字と数値型の数字を計算しようとしたときです。
文字列型の「’100’」と数値型の「100」は人間から見ると同じ数字に見えますが、コンピュータから見ると全く別物です。
数値型の「100」は数字の1として認識しますが、文字列型の「’100’」はあくまで文字であって、数字の1として認識しないのです。
なので、以下のような場合にはエラーとなります。
num_A = 100
num_B = '100'
num_A + num_B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
これを解消するには、両方を数値型に置き換えて計算する必要があります。
このように「int()」関数を使うことで、文字列型の数字も数値型に簡単に変換できます。
num_A = 100
num_B = '100'
num_A + int(num_B)
200
TypeError: function() missing 1 required positional argument:
このエラーが発生するのは、関数に渡す引数が足りない場合です。
たとえば、ある関数には2つの引数が設定されているにもかかわらず、その関数を呼び出すときに引数を1つしか渡さなかった場合にこのエラーを見ることになります。
たとえばこの例では、関数「function」にはAとBの2つの引数が設定されています。
そして、呼び出すときには100という一つの引数しか与えていないため、エラーが発生しています。
def function(A, B):
result = A + B
return result
function(100)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: function() missing 1 required positional argument: 'B'
このエラーを解消するためには、関数が必要とする引数を渡すだけでOKです。
def function(A, B):
result = A + B
return result
function(100, 100)
200
TypeError: ‘str’ object is not callable
このエラーは、文字列型のデータを呼び出すとき、関数を呼び出すときのように「()」を付けてしまったときなどによく発生します。
文字列型だけでなく数値型のデータのときも同様で、数値型の場合は「TypeError: ‘int’ object is not callable」と表示されます。
たとえば、こんな場合に発生します。
ご覧のとおり、mynameは文字列型であるにも関わらず、呼び出すときに「()」を付けてしまっているためにエラーが発生しています。
myname = 'gengen'
myname()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
もしあなたが関数を使いこなせる程度にPythonに慣れている人なら、「まさかこんな馬鹿な間違いはしていないよ!」と思われるかもしれません。
しっかりと関数も作っている、でもこのエラーが発生しているというケースに遭遇しているかもしれませんね。
そういった場合に見直してほしいのが「関数を変数で上書きしていないか」ということです。
たとえば、こういうケースですね。
ご覧のとおり、先に定義した関数が、後から定義した同じ名前の変数で上書きされてしまっているのです。
もう一度あなたのコードを見直してみて、このようなミスが無いかどうか確かめてみてください。
def myname():
name = 'gengen'
print(name)
myname = 'gengen'
myname()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
IndexError: list index out of range
このエラーは、リスト型のデータに大して、範囲外の値を取り出そうとしたときに発生するエラーです。
たとえば、以下のような場合にこのエラーが発生します。
例にあげた「mylist」には、5つしか値が無いにも関わらず、mylist[5]で6つ目の値を取り出そうとしているためにエラーが発生しています。
mylist = ['lemon', 'apple', 'grape', 'orange', 'melon']
mylist[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
いやいや、[5]なのに6つ目ってどういうこと?って思われたあなた。
リスト型は[0]が1つ目だということをお忘れではありませんか?
なので、この例の場合に5つ目の値を取り出したいときは、mylist[4]を指定することで、このエラーを解消することができます。
mylist = ['lemon', 'apple', 'grape', 'orange', 'melon']
mylist[4]
'melon'