Глава 4 · Python любит числа

Деление: /, //, % и divmod()

Три родственных оператора деления — и почему отрицательное целочисленное деление работает не так, как кажется на первый взгляд.

У деления в Python на самом деле три родственных, но разных оператора — и путаница между ними одна из самых частых у новичков.

17 конфет на 5 детей

Представим задачу: у нас 17 конфет, и мы делим их поровну между 5 детьми.

🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬🍬
konfety.py
candies = 17
children = 5

print(candies / children)   # 3.4  — точное дробное деление
print(candies // children)  # 3    — по 3 конфеты каждому ребёнку
print(candies % children)   # 2    — 2 конфеты остались нераспределены

Каждый ребёнок получает candies // children целых конфет, а candies % children — сколько осталось «в остатке». Удобно получить оба числа сразу:

divmod_demo.py
print(divmod(17, 5))  # (3, 2)

Чуть глубже: отрицательное floor-деление

С отрицательными числами // ведёт себя не так, как «просто отбросить дробную часть» — а округляет результат в сторону минус бесконечности (floor):

otricatelnoe.py
print(-7 // 3)  # -3, а не -2
print(-7 % 3)   # 2
-4-3-2-10-7 // 3-7 / 3
-7 // 3 округляется вниз, к -3 (в сторону минус бесконечности), а не к -2
Почему так, а не иначе
// в Python определён как «floor division» — округление результата деления вниз, к ближайшему целому В СТОРОНУ минус бесконечности. Для положительных чисел это выглядит как обычное отбрасывание дробной части, но для отрицательных — даёт число МЕНЬШЕ, а не ближе к нулю. Это не баг, а осознанное определение оператора, одинаковое во всех версиях Python.
Практика: деление, остаток и divmod()
Интерактивный ноутбук прямо в браузере — включая отрицательное floor-деление
Открыть практику →