Code Fix

初級

ZeroDivisionError: division by zero の原因と直し方

0による除算・剰余算で発生する例外です。/ と // と % のいずれでも、分母や除数が0だと例外になります。

エラーメッセージの読み方

Traceback (most recent call last):
main.py
ファイル名
3
行番号 — 実際にクラッシュした行
<module>
発生場所 — <module> ならトップレベル、関数名ならその関数の中
ZeroDivisionError
例外クラス — 何が起きたか。ここを検索するのが最短です
division by zero
詳細メッセージ — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  a = 10
 2  b = 0 
         ^
 3  print(a / b)
Traceback (most recent call last): File "main.py", line 3, in <module> print(a / b) ~~^~~ ZeroDivisionError: division by zero

int型同士の割り算でも分母が0だと例外になります。floatに変えても解決しません。0で割ろうとした時点でエラーです。

直し方: 0 を 5 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  a = 10
 2  b = 0 
         ^
 3  print(a % b)
Traceback (most recent call last): File "main.py", line 3, in <module> print(a % b) ~~^~~ ZeroDivisionError: integer modulo by zero

剰余演算子 % も同じです。0で割った余りは定義できないため、Pythonは例外を投げます。

直し方: 0 を 5 にします。

この問題を解いてみる →

パターン3

 1  a = 10
 2  b = 0 
         ^
 3  print(a // b)
Traceback (most recent call last): File "main.py", line 3, in <module> print(a // b) ~~^^~~ ZeroDivisionError: integer division or modulo by zero

切り捨て除算 // でも同様に例外になります。/ と // のどちらを使っても、分母が0であることは変わりません。

直し方: 0 を 5 にします。

この問題を解いてみる →

パターン4

 1  a = 10.0
 2  b = 0 
         ^
 3  print(a / b)
Traceback (most recent call last): File "main.py", line 3, in <module> print(a / b) ~~^~~ ZeroDivisionError: float division by zero

分子がfloatでも同じです。0で割ろうとした時点で、型に関わらず例外になります。

直し方: 0 を 2 にします。

この問題を解いてみる →

パターン5

 1  a = 10
 2  b = 0 
         ^
 3  print(divmod(a, b))
Traceback (most recent call last): File "main.py", line 3, in <module> print(divmod(a, b)) ^^^^^^^^^^^^ ZeroDivisionError: integer division or modulo by zero

divmod()は商と余りを同時に返す組み込み関数ですが、内部では割り算をしているため0を渡すと同じ例外になります。

直し方: 0 を 3 にします。

この問題を解いてみる →

よくある誤解

int型同士だけの話だと思われがちですが、Pythonでは浮動小数点数(float)同士の0除算も ZeroDivisionError になります。他の言語ではfloatの0除算がInfinityになることがあり、その前提を持ち越すと痛い目に遭います。

実務での勘所

0除算を例外にする設計は、Pythonの「エラーは黙って握りつぶさず、はっきり知らせる」という言語哲学の表れです。IEEE 754に厳密に従う言語ではfloat同士の0除算がInfinityやNaNという「静かな」結果になりますが、Pythonは意図的にそこから外れ、int・float問わず例外を投げます。実務では、割る前にif denominator == 0:と事前確認するより、try: ... except ZeroDivisionError:で例外を捕まえる書き方のほうがPythonでは好まれます(EAFP、「許可を求めるより許してもらうほうが簡単」という考え方です)。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)