こんにちは、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
を例外処理しましょう。