Глава 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
Почему так, а не иначе
// в Python определён как «floor division» — округление результата деления вниз, к ближайшему целому В СТОРОНУ минус бесконечности. Для положительных чисел это выглядит как обычное отбрасывание дробной части, но для отрицательных — даёт число МЕНЬШЕ, а не ближе к нулю. Это не баг, а осознанное определение оператора, одинаковое во всех версиях Python.Практика: деление, остаток и divmod()
Интерактивный ноутбук прямо в браузере — включая отрицательное floor-деление