Pythonのゼロ除算エラー(ZeroDivisionError)
ゼロ除算 (division by zero) とは、ある数値を 0 で割る演算を意味します。よく知られているように、数学においてゼロ除算は定義されない演算なので、多くのプログラミング言語においてもゼロ除算を実行するとエラーまたは NaN (Not a Number : 非数) が返るように設計されています。Python ではゼロ除算に対して ZeroDivisionError が発生します。
# PYTHON_ZERODIVISION
# In[1]
# ゼロ除算を実行
print(1/0)
# ZeroDivisionError: division by zero
NumPyのゼロ除算
ゼロ除算 に対してエラーではなく特殊な値を返すように設計されている拡張パッケージもあります。たとえば、NumPy ではゼロ除算に対して numpy.inf という値を返します。
# NUMPY_ZERODIVISION
# In[1]
import numpy as np
# 1次元配列を作成
arr = np.array([1, 2, 3])
# 配列arrに対してゼロ除算を実行
print(arr/0)
# [inf inf inf]
# RuntimeWarning: divide by zero encountered in true_divide
numpy.inf は無限大を表す特殊値であり、ゼロ除算を「割る数 (分母) を正方向から 0 に近づける右側極限操作」と設定しています。ただし上の実行結果にあるように、0 で割っていることを示す警告文も添えられます。これはユーザーが意図しないゼロ除算を知ることができるようにとの配慮だと考えられます 。
ゼロ除算の戻り値にinfを設定
NumPy を使っていなくても、ゼロ除算に対してエラーではなく inf を返すようにしたいと考えるかもしれません。そのような場合には、たとえば次のような除算関数を定義します。
# PYTHON_ZERODIVISION_INF
# In[1]
# 除算関数を定義
def div(a, b):
if b == 0:
return a * float("inf") / abs(a)
else:
return a / b
# -5/0を計算
x = div(-5, 0)
print(x)
# -inf
a を掛けて a の絶対値で割っているのは、a の符号を戻り値に反映させるためです。すなわち div(5, 0) は inf を返し、div(-5, 0) は -inf を返します。
ゼロ除算の戻り値にnanを設定
ゼロ除算を意味のない演算であると考えるなら、戻り値を nan (not a number : 非数) に設定するという方法もあります。これは実質的に inf よりもエラーに近い設定です。Python 本体には特殊浮動小数点数として nan が組み込まれており、float('nan') で呼び出すことができます。
# PYTHON_ZERODIVISION_NAN
# In[1]
# 除算関数を定義
def div_2(a, b):
if b == 0:
return float("nan")
else:
return a / b
# 1/0を計算
x = div_2(1, 0)
print(x)
# nan
【GPT4脚本】ZeroDivisionErrorの回避策
【シーン:オフィスのデスク】
社員A:「ZeroDivisionErrorって、Pythonでよく出るエラーだよね」
社員B:「そうだね。0で割るとエラーが出るから、気をつけないといけない」
社員A:「でも、どうやって対処すればいいんだろう?」
社員B:「例えば、分母が0の場合は、条件分岐を使って0で割る前に分母が0かどうかをチェックするようにするといいよ」
社員A:「なるほど、条件分岐を使えばエラーを回避できるんだね。でも、どうやって実装すればいいんだろう?」
社員B:「Pythonの場合、if文を使って分母が0かどうかをチェックすることができるよ。例えば、以下のように書けるね」
社員A:「なるほど、分母が0の場合はエラーメッセージを表示するようにすればいいんだね」
社員B:「そうだね。ZeroDivisionErrorを回避するためには、分母が0かどうかをチェックすることが大切だよ」