← 中文资源

简体中文版本

Python ZeroDivisionError — 除以零

通过校验除数、仅在分母非零时计算比率,并为空集合返回明确定义的值,修复 ZeroDivisionError。

阅读英文原文

症状

本篇调试指南针对“Python ZeroDivisionError — 除以零”。内容涵盖可观察的症状、可复现的诊断路径、根本原因、具体修复方式,以及如何验证修复并防止回归。

可观察到的症状包括:

  • Python 抛出 “ZeroDivisionError: division by zero”
  • 平均或百分比等比率在空数据集上失败
  • 仅当计数确实为零时才出现错误

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

python -c "print(sum([]) / len([]))"

确认是空数据集路径,分母来自 len()。

步骤 2

grep -rn "/ len(\|/ count\|/ total" src/

每一处对计算计数的无防护除法都是待修候选。

常见诱因(按出现频率排序):

  • 分母来自可能为空或求和为零的数据
  • 在检查计数是否为零之前就计算了指标
  • 本应使用受保护的浮点除法,却用了整除

根因

当 /、//、% 的右操作数为零时 Python 抛 ZeroDivisionError。分母为零几乎总意味着输入集为空或其总和为零,而代码未处理这一数据条件。

修复

为每个计算得到的除数加防护:分母为零时返回明确定义的默认值(0、None 或 NaN),或改用 statistics.mean(对空输入抛出清晰的 StatisticsError)。

注意:把未定义比率返回 0 可能被误读为真实零;应记录该选择,或返回 None 以示区分。

def average(values):
    n = len(values)
    if n == 0:
        return None          # undefined rate, not 0
    return sum(values) / n

print(average([]))     # None
print(average([2, 4])) # 3.0

验证

用空数据集重跑,确认无异常且得到预期的哨兵值;为零与非零分母补充测试。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。