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)
int型同士の割り算でも分母が0だと例外になります。floatに変えても解決しません。0で割ろうとした時点でエラーです。
直し方: 0 を 5 にします。
パターン2
1 a = 10 2 b = 0 ^ 3 print(a % b)
剰余演算子 % も同じです。0で割った余りは定義できないため、Pythonは例外を投げます。
直し方: 0 を 5 にします。
パターン3
1 a = 10 2 b = 0 ^ 3 print(a // b)
切り捨て除算 // でも同様に例外になります。/ と // のどちらを使っても、分母が0であることは変わりません。
直し方: 0 を 5 にします。
パターン4
1 a = 10.0 2 b = 0 ^ 3 print(a / b)
分子がfloatでも同じです。0で割ろうとした時点で、型に関わらず例外になります。
直し方: 0 を 2 にします。
パターン5
1 a = 10 2 b = 0 ^ 3 print(divmod(a, b))
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、「許可を求めるより許してもらうほうが簡単」という考え方です)。