
こんにちは、PyQサポートです。
今回は ZeroDivisionError: division by zero というエラーの意味と、その解消方法を解説します。
早速、質問を見ていきましょう。
質問 ZeroDivisionError: division by zero というエラーはどういうものですか?
ZeroDivisionError: division by zeroというエラーが出ました。
どのように直したら良いでしょうか?
入力した内容(コード)
def avg(nums): """数値リスト中の数値の平均を返す""" return sum(nums) / len(nums) avg([0, 1, 2, 3]) avg([])
出たエラー(実行結果)
Python 3.10 で実行した結果
Traceback (most recent call last):
File "/Users/pyq/zerodiv.py", line 7, in <module>
avg([])
File "/Users/pyq/zerodiv.py", line 3, in avg
return sum(nums) / len(nums)
ZeroDivisionError: division by zero
回答 ゼロで除算しています
まずエラーメッセージから確認しましょう。
ZeroDivisionError: division by zero
ZeroDivisionErrorというエラーが発生しています。
これはdivision by zeroとあるように、ゼロ(0)で除算を行った場合に発生するエラーです。
次にエラーが発生している箇所を、トレースバックから確認してみます。
トレースバックは一番下にエラーの発生箇所が出力され、下から順番にその呼び出し元が出力されます。
そのため、まずはトレースバックの最下部を見てみましょう。
File "/Users/pyq/zerodiv.py", line 3, in avg
return sum(nums) / len(nums)
これは以下の関数のreturn文でエラーが発生したということです。
def avg(nums): """数値リスト中の数値の平均を返す""" return sum(nums) / len(nums)
このavg()関数は、数値のリストを受け取り、その合計(sum(nums))と長さ(len(nums))から平均を計算して返す関数です。
ゼロ除算エラーが発生しているので、len(nums)の部分が怪しそうです。
そこで、さらにトレースバックをたどってみます。
File "/Users/pyq/zerodiv.py", line 7, in <module>
avg([])
これによると、以下のavg()関数の呼び出し部分が問題のようです。
avg([])
空のリスト([])をavg()に渡していますが、これだとavg()内ではlen(nums)が0となってしまい、ZeroDivisionErrorが発生します。
avg([0, 1, 2, 3])のように、1つ以上の要素があるリストであれば問題ありませんが、空リストの場合の考慮が漏れていたと言えるでしょう。
対応方法
ZeroDivisionErrorを、適切に例外処理してください。
avg()の仕様次第で、関数内で例外処理するか、関数外で例外処理するかが決まります。
たとえば、avg()が「ゼロ除算の発生時はそのまま例外を投げる」という仕様であれば、以下のようにavg()の呼び出し元で例外処理します。
def avg(nums): """数値リスト中の数値の平均を返す""" return sum(nums) / len(nums) try: avg([0, 1, 2, 3]) avg([]) except ZeroDivisionError: print("ゼロ除算が発生しました")
まとめ
ZeroDivisionErrorはゼロで除算した場合に起きるエラーです。
このエラーが発生したら、ゼロ除算が発生している箇所を調査し、適切にZeroDivisionErrorを例外処理しましょう。