こんにちは、マサキです。
今回はPythonにおけるデバッグ方法・対策についてご紹介したいと思います。
プログラミングではエラーはつきものですよね…
これから、Pythonでよく出てくるエラーとその解決方法を説明していきます。
エラーの種類と解決
今回は3種類のエラーについて説明ます。
Syntax Errors : 文法エラー
Syntax Errorの例としては↓のようなものがあります。
# printを実行 "のつけ忘れ
print("This is the error)
⇓
# エラーが出る
File "<ipython-input-1-c1b5b7f1f4a3>", line 1
print("This is the error)
^
SyntaxError: EOL while scanning string literal
これはprint文の“This is the errorの最後に“をつけていないことが原因です。
また、↓のようなエラーもあります。
# 空白が全角になっている
1 + 1
⇓
# エラーが出る
File "<ipython-input-2-6a1d737d6e97>", line 1
1 + 1
^
SyntaxError: invalid character in identifier
コードを書くときのスペース(空白)が全角になっているとこんなエラーが出てしまいます。
よくある文法エラーの例は以下のようになります。
- クォテーション“やカッコ()の閉じ忘れ
- コロン:のつけ忘れ
- =と==を混同してしまっている
- インデントの誤り
- 全角の空白がある
Syntax Error(文法エラー)が出たときはこのようなミスをしていないか確認しましょう。
だいたいこれに気をつければ文法エラーは解消できます。
Runtime Errors : 実行エラー
Runtime Errorのエラーの例としては↓のようなものがあります。
print(1/0)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-2fc232d1511a> in <module>()
----> 1 print(1/0)
ZeroDivisionError: division by zero
1を0で割ることができないのでエラーとなります。
よくある実行エラーの例は以下のようになります。
- 文字列やリストの要素エラー
- 変数名・関数名の打ち間違え
- 無限の繰り返し
- 型と処理の不整合
- ゼロ分割(0で割ってしまう)
- ファイルの入出力誤り
原因がわからない場合はprintを挿入して処理の入出力を確認するのも良いです。
Logical Errors : 論理エラー
論理エラーとは、「プログラムを実行できるが、意図する結果と異なる動作をする」エラーのことです。
例えば、以下のように関数medianを定義してx、y、zの中間値(真ん中の値)を求めようとすると、うまくできません。
def median(x,y,z):
if x>y:
x = y
y = x
if z<x:
return x
if z<y:
return z
return y
median(3,1,2)
# 1
1、2、3の中間値は2なので、この出力は間違っています。
これで関数の定義が間違っていることがわかるので、どこが間違いなのかを調べるためにprintを使ってxとyの値を調べてみます。
def median(x,y,z):
if x>y:
x = y
y = x
print(x,y)
if z<x:
return x
if z<y:
return z
return y
median(3,1,2)
# 1 1
# 1
xとyが同じ値になってしまっていることがわかります。
そこで、↓のように修正します。
def median(x,y,z):
if x>y:
w = x
x = y
y = w
print(x,y)
if z<x:
return x
if z<y:
return z
return y
median(3,1,2)
# 1 3
# 2
これで正しい値が出力されました!
このように、printを使うことで、処理の途中で変数の値がどう変わっているのかを知ることができ、エラーの解決に役立ちます。