Деление в Python: /, // и %
print(17 / 5)
print(17 // 5)
print(17 % 5)
print(divmod(17, 5))3.4
3
2
(3, 2)| Знак | Что даёт | Для 17 и 5 |
|---|---|---|
/ | обычное деление, результат всегда дробный | 3.4 |
// | целая часть от деления (округление вниз) | 3 |
% | остаток от деления | 2 |
divmod(a, b) | целую часть и остаток сразу | (3, 2) |
Проверка: 17 = 5 × 3 + 2.
/ всегда даёт дробное число
print(10 / 2)
print(10 // 2)
print(int(10 / 2))5.0
5
5Даже когда делится нацело, / возвращает float. Если нужно целое — пишите //. Для очень больших чисел / вдобавок теряет точность, а // считает точно.
Отрицательные числа
// округляет вниз — к меньшему числу, а не к нулю. Остаток % при этом имеет тот же знак, что и делитель:
print(-17 // 5)
print(-17 % 5)
print(int(-17 / 5))
print(17 // -5, 17 % -5)-4
3
-3
-4 -3−17 / 5 = −3.4, вниз — это −4. Остаток: −17 = 5 × (−4) + 3. Зато int(-17 / 5) отбрасывает дробную часть и даёт −3.
Сравнение с Pascal
В Pascal div и mod отбрасывают дробную часть — округляют к нулю. Для положительных чисел результаты одинаковы, для отрицательных — нет:
| Выражение | Pascal | Python |
|---|---|---|
| 17 и 5: частное, остаток | 17 div 5 = 3, 17 mod 5 = 2 | 17 // 5 = 3, 17 % 5 = 2 |
| −17 и 5: частное, остаток | -17 div 5 = −3, -17 mod 5 = −2 | -17 // 5 = −4, -17 % 5 = 3 |
Если решение задачи переносится с Pascal и там бывают отрицательные числа, это место нужно проверить. Зато в Python n % 2 для любого целого n даёт 0 или 1, и проверка нечётности n % 2 == 1 работает и для отрицательных чисел.
Частые применения
n = 2047
print(n % 2 == 0)
print(n % 10)
print(n // 10)
seconds = 3725
print(seconds // 3600, seconds % 3600 // 60, seconds % 60)False
7
204
1 2 5n % 2 == 0— число чётное;n % 10— последняя цифра,n // 10— число без неё;a % b == 0—aделится наbбез остатка;- часы, минуты и секунды из общего числа секунд — через
//и%.
Дробные числа
// и % работают и с дробными, результат тоже дробный: 7.5 // 2 даёт 3.0, 7.5 % 2 — 1.5.
Деление на ноль
Делить на ноль нельзя ни одним из способов — программа остановится:
ZeroDivisionError: division by zeroЕсли делитель может оказаться нулём (например, количество элементов пустого списка), проверьте его заранее через if или перехватите ошибку через try и except — см. урок Файлы и исключения.