Ошибка ZeroDivisionError: деление и остаток на ноль, пустой список

Ошибки Pythonобновлено 07.10.20268 мин чтенияесть тренажёр

ZeroDivisionError в Python — это ошибка деления на ноль: в выражении с /, // или % делитель оказался равен нулю. Часто ноль приходит не из кода, а из ввода пользователя или из длины пустого списка. Защита простая: проверить делитель условием перед делением или поймать ошибку конструкцией try/except.

Загружаем…

Что значит 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) перед строкой с делением и запустите программу с тем же вводом. Увидев ноль, идите вверх по коду и ищите, где переменная получила это значение.