Что значит ZeroDivisionError в Python
ZeroDivisionError в Python — это остановка программы в момент, когда нужно разделить на ноль. Строки выше успевают выполниться, а на проблемном выражении работа прекращается.
Название читается по частям: zero — ноль, division — деление, error — ошибка. В официальной документации Python[1] это исключение описано как возникающее, когда второй аргумент операции деления или взятия остатка равен нулю. Важно, что ошибка относится не к записи кода, а к конкретным числам: выражение a / b прекрасно работает при b = 4 и падает при b = 0. Поэтому одна и та же программа может десять раз отработать без проблем, а на одиннадцатом вводе остановиться из-за деления на ноль.
В редакторе над статьёй средний балл считается по пустому списку оценок. Нажмите «▶ Запустить»: в окне «Вывод» появится сообщение об ошибке и подсказка на русском. Ниже мы разберём, почему так происходит и как написать проверку, после которой программа выведет понятный ответ вместо ошибки.
Почему у деления на ноль нет ответа
Деление — это действие, обратное умножению: 12 / 3 = 4, потому что 4 × 3 = 12. Для деления на ноль такого числа нет, поэтому результат не определён.
Попробуем найти 12 / 0. Нужно число, которое при умножении на 0 даст 12. Но любое число, умноженное на ноль, даёт ноль. Значит, подходящего ответа не существует, и Python не выдумывает его, а сообщает об ошибке. А вот 0 / 12 — совершенно законная операция, результат 0.0. Делить ноль можно, делить на ноль — нет. В некоторых языках программирования деление дробного числа на ноль даёт особое значение «бесконечность», но Python поступает строже: 1 / 0.0 тоже вызывает ZeroDivisionError. Это удобно новичку — ошибку невозможно пропустить.
Из этого следует практический вывод для программиста: компьютер не «плохо считает», он честно отказывается от операции без ответа. Значит, решать, что показать пользователю вместо результата, должен автор программы. Все проверки, о которых пойдёт речь ниже, сводятся к одному вопросу: может ли делитель в этой строке оказаться нулём при каких-нибудь входных данных? Если может — нужна защита, если нет — достаточно убедиться в этом один раз.
Какие операции дают деление на ноль: таблица
В Python есть 4 способа разделить, и все они не терпят нулевого делителя: обычное деление, целочисленное, остаток и функция divmod().
| Запись | Что делает | При делителе 0 Python пишет |
7 / 0 | Обычное деление | division by zero |
7.5 / 0 | Деление дробного | float division by zero |
7 // 0 | Целочисленное деление | integer division or modulo by zero |
7 % 0 | Остаток от деления | integer modulo by zero (в старых версиях — как у //) |
divmod(7, 0) | Частное и остаток вместе | integer division or modulo by zero |
0 ** -1 | Ноль в отрицательной степени | тоже ZeroDivisionError |
Точный текст после двоеточия зависит от версии языка и в редакторе на сайте может выглядеть иначе, но название ZeroDivisionError одинаково везде. В справочнике встроенных исключений документации Python отдельно сказано, что ZeroDivisionError срабатывает и для деления, и для взятия остатка, поэтому проверки нужны перед каждой из этих операций, а не только перед знаком «/». Подробно операции // и % объясняет урок про математику в Python.
Ноль из ввода пользователя
Если делитель вводит пользователь, рано или поздно кто-нибудь введёт 0. Программа, которая не готова к этому, упадёт на делении на ноль.
konfety = int(input("Сколько конфет? "))
deti = int(input("Сколько детей? "))
print("Каждому достанется:", konfety // deti)
Сколько конфет? 20
Сколько детей? 0
Traceback (most recent call last):
File "main.py", line 3, in <module>
print("Каждому достанется:", konfety // deti)
~~~~~~~~^^~~~~~
ZeroDivisionError: integer division or modulo by zero
Обратите внимание: первые две строки выполнились, программа спросила оба числа и упала только на третьей строке. Это отличает ошибку деления от синтаксической, при которой не выполнилось бы ничего. В задаче про конфеты ноль детей — не бессмыслица, а вполне реальная ситуация, на которую программа должна ответить по-человечески. Такая же ловушка подстерегает в учебном проекте калькулятора — пример с защитой есть в статье про калькулятор на Python.
Среднее значение пустого списка
Среднее считают как сумму, делённую на количество: sum(spisok) / len(spisok). Если список пуст, len равна 0, и деление на ноль неизбежно.
Эта ситуация коварнее ввода, потому что нуля в коде вообще не видно. Список мог опустеть после фильтрации: например, вы отобрали только пятёрки, а их не оказалось. Или пользователь сразу ввёл стоп-слово, и в список не попало ни одного числа. Сумма пустого списка равна 0, длина тоже 0, и выражение 0 / 0 вызывает ошибку. Исправление — проверить длину заранее:
ocenki = []
if len(ocenki) > 0:
print("Средний балл:", sum(ocenki) / len(ocenki))
else:
print("Оценок пока нет")
Короче можно написать if ocenki: — пустой список в условии считается ложным. Как работать со списками, их длиной и суммой, разобрано в уроке про списки в Python.
Миф: «Деление на ноль бывает только тогда, когда в коде прямо написано / 0». Это не подтверждается: в реальных программах ноль почти всегда появляется во время работы — из ввода, из пустого списка или после округления.
Остаток от деления на ноль в циклах
Операция % с нулём справа — это частая ошибка в задачах на делители. Она возникает, когда перебор начинают с 0 вместо 1.
n = 12
for d in range(n + 1):
if n % d == 0:
print(d)
range(n + 1) начинается с нуля, и на первом же шаге Python пытается вычислить 12 % 0. Делители числа начинаются с единицы, поэтому правильный перебор — range(1, n + 1):
n = 12
for d in range(1, n + 1):
if n % d == 0:
print(d)
Программа выведет 1, 2, 3, 4, 6 и 12. Такой перебор встречается в задачах на простые числа, НОД и делители, которые собраны на странице задачи на числа.
Как предотвратить ZeroDivisionError в Python
Чтобы предотвратить ZeroDivisionError в Python, есть 2 способа: проверить делитель условием до деления или выполнить деление внутри try и обработать ошибку в except.
Проверка условием понятнее и подходит, когда вы заранее знаете, откуда может прийти ноль:
a = 20
b = 0
if b != 0:
print(a / b)
else:
print("На ноль делить нельзя")
Конструкция try/except удобна, когда делений несколько или ноль может возникнуть в неожиданном месте. Она описана в документации Python в разделе об обработке исключений:
a = 20
b = 0
try:
print(a / b)
except ZeroDivisionError:
print("Делитель равен нулю, ответа нет")
Оба варианта выведут понятное сообщение вместо остановки программы. Новичку лучше начинать с проверки через if: она заставляет подумать, при каких данных случится ноль. По федеральной образовательной программе основного общего образования ветвления изучают в 8 классе[2], так что этого инструмента уже достаточно.
Миф: «Если обернуть деление в try/except, программа всегда будет правильной». Такой гарантии не существует: ошибка исчезнет, но нужно ещё решить, что программа должна вывести вместо ответа. Пустой
exceptбез действия просто спрячет проблему.
Когда проверка на ноль не поможет
Проверка b != 0 не поможет, если делитель становится нулём позже или ошибка вообще в другом. Вот 4 таких случая.
- Делитель — результат округления.
round(0.4)иint(0.9)дают 0: проверяйте уже округлённое значение. - Делитель меняется внутри цикла. Проверка до цикла бесполезна, если на 3-м шаге он стал 0.
- Делитель очень маленький, например 0.0000001. Ошибки нет, но результат огромный — 10000000.0; это вопрос логики задачи.
- Ввод «0,5» вместо 0.5. Программа упадёт раньше, на
float(), с ошибкой из статьи про ValueError при вводе.
Чего делать нельзя
Нельзя подменять ответ на деление на ноль случайным числом: программа перестанет падать, но начнёт врать. Вот правила.
- Нельзя делить на значение из input() без проверки на ноль.
- Не стоит считать среднее по списку, не убедившись, что он не пуст.
- Не следует начинать перебор делителей с 0 — первый делитель всегда 1.
- Нельзя возвращать 0 вместо ответа молча: пользователь решит, что результат и правда ноль.
- Не стоит писать пустой except: — указывайте ZeroDivisionError явно.
- Не допускается проверять делитель только один раз, если он меняется в цикле.
Источники
[1] The Python Tutorial (официальная документация Python 3). Python Software Foundation. — синтаксис и встроенные функции.
[2] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования». — информатика 7–9.
[3] ФИПИ. Методические рекомендации для обучающихся по организации индивидуальной подготовки к ОГЭ 2026 года. Информатика. М., 2026.
Вопросы и ответы
Почему 0 / 5 работает, а 5 / 0 — нет?
Ноль, делённый на любое ненулевое число, равен нулю: 0 × 5 = 0. А для 5 / 0 нет числа, которое при умножении на ноль даст 5.
Почему ZeroDivisionError в Python возникает и с дробным 0.0?
Python одинаково строг к целому и дробному нулю. Некоторые языки в этом случае возвращают «бесконечность», но Python предпочитает сообщить о проблеме.
Что лучше: if или try/except?
Если источник нуля понятен, используйте if — так код читается проще. Если делений много или данные приходят из разных мест, удобнее try/except.
Бывает ли деление на ноль на ОГЭ?
По материалам ФИПИ задание 16 — программа на универсальном языке, которую пишут на компьютере[3]. Если в задаче считается среднее или процент, стоит подумать, может ли количество оказаться нулевым.
Почему остаток от деления на ноль тоже ошибка?
Остаток вычисляется через целочисленное деление: a % b — это то, что остаётся после a // b. Раз частное не определено, остаток тоже.
Как найти, откуда взялся ноль?
Поставьте print(b) перед строкой с делением и запустите программу с тем же вводом. Увидев ноль, идите вверх по коду и ищите, где переменная получила это значение.