Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【Pythonお悩み解決】ZeroDivisionError: division by zero とは何ですか?

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

Copyright ©2017- BeProud Inc. All rights reserved.