Справочник по Python · модуль 1 · данные и имена
Глава 1.8
Операции деления:
/, // и %
Деления в Python три, и это не прихоть языка: у задачи «разделить» бывает три разных ответа. Сколько получится в точности, сколько получится целых и сколько осталось — на каждый вопрос свой оператор. Пара // и % вдобавок умеет то, чего от арифметики не ждёшь: разбирать число по цифрам.
- Категория
- Синтаксис и базовые концепции
- Уровень
- Начальный
- Связанные темы
- Типы данных, условия, циклы
- Зачем это знать
- Выбирать нужный вид деления и работать с цифрами числа
§1Три вида деления
Разделить 45 на 4 можно тремя способами, и все три нужны на практике.
| Оператор | На какой вопрос отвечает | 45 и 4 | Тип результата |
|---|---|---|---|
/ | сколько получится в точности | 11.25 | всегда float |
// | сколько получится целых | 11 | int, если оба целые |
% | сколько осталось | 1 | int, если оба целые |
Житейская проверка: 45 конфет на 4 человек. Каждому достанется по 11 штук (//), одна останется в вазе (%), а «по 11.25 конфеты» (/) — ответ математически верный, но конфету так не поделишь. Выбор оператора — это выбор того, какой ответ вам нужен.
§2/ — обычное деление
Оператор / выполняет обычное математическое деление. Его результат всегда имеет тип float — даже когда делятся два целых числа и делятся нацело.
print(5 / 2) # 2.5 print(6 / 3) # 2.0 ← не 2, а 2.0 print(45 / 4) # 11.25
Строка 6 / 3 заслуживает внимания: результат целый по существу, но тип у него дробный. Приведение операндов к int ничего не изменит — int(6) / int(3) тоже даст 2.0. Тип результата определяется самим оператором, а не тем, что в него передали.
Такое поведение появилось в Python 3. В Python 2 деление двух целых давало целое: 5 / 2 возвращало 2. Отсюда живучая путаница в старых примерах из интернета — если код ведёт себя не так, как описано в статье, посмотрите на год публикации.
Второе, о чём стоит помнить: результат деления часто оказывается бесконечной дробью.
print(1 / 3) # 0.3333333333333333
Полная точность здесь недостижима — компьютер хранит ограниченное число разрядов. Поэтому результат либо округляют при выводе (f"{x:.2f}"), либо, если дробная часть вообще не нужна, берут другой оператор.
§3// — деление без остатка
Оператор // выполняет целочисленное деление: возвращает целую часть результата, отбрасывая дробную.
print(5 // 2) # 2 print(6 // 3) # 2 print(45 // 4) # 11
Тип результата определяют операнды: два целых дают int, но стоит одному из них оказаться дробным — и результат станет float, пусть даже с нулевой дробной частью.
print(5 // 2.0) # 2.0 print(5.0 // 2) # 2.0
Если целый результат нужен обязательно — приведите его явно: int(5.0 // 2) даст 2. Это тот же приём, что и в главе о вводе: язык не догадывается за вас, какой тип нужен на выходе.
§4% — остаток от деления
Оператор % возвращает остаток от деления — то, что не поместилось в целые части.
print(10 % 3) # 1
Проверить результат легко по школьной записи деления с остатком: 10 = 3 * 3 + 1. Тройка помещается в десятке три раза, единица остаётся. Именно эту единицу и вернул оператор.
Операторы // и % — пара: первый отвечает, сколько раз поместилось, второй — сколько осталось. Вместе они решают целый класс бытовых задач.
total = 137 minutes = total // 60 # 2 — сколько целых минут seconds = total % 60 # 17 — сколько секунд осталось print(f"{minutes} мин {seconds} с") # 2 мин 17 с
Так же считают сдачу монетами, страницы из записей, коробки из штук — везде, где целое и остаток нужны одновременно.
Для отрицательных // округляет не «к нулю», а вниз: -7 // 2 даёт -4, а не -3. Остаток при этом всегда неотрицателен, если делитель положителен: -7 % 2 равно 1. Правило a == (a // b) * b + a % b при этом соблюдается всегда. Пока достаточно просто помнить: на отрицательных числах результат стоит проверить, а не додумать.
§5% выделяет последние цифры
А теперь применение, ради которого % и вспоминают чаще всего. Остаток от деления на 10 — это последняя цифра числа.
number = 12345 last_digit = number % 10 print(last_digit) # 5
Логика прозрачна: 12345 — это 1234 десятка и ещё 5. Десятки делятся на 10 нацело, а единицы остаются в остатке. Увеличивая делитель, мы забираем больше цифр с конца:
| Выражение | Результат для 12345 | Что получили |
|---|---|---|
number % 10 | 5 | последняя цифра |
number % 100 | 45 | последние две цифры |
number % 1000 | 345 | последние три цифры |
§6// отрезает последние цифры
Целочисленное деление работает зеркально: оно убирает цифры с конца.
number = 12345 without_last = number // 10 print(without_last) # 1234
| Выражение | Результат для 12345 | Что получили |
|---|---|---|
number // 10 | 1234 | без последней цифры |
number // 100 | 123 | без двух последних |
number // 1000 | 12 | без трёх последних |
Запомнить пару легко по действию: % оставляет хвост, // его отрезает. Комбинируя их, можно достать любую цифру числа — сначала отрезать всё лишнее справа, потом взять остаток.
§7Разбор задачи: число по цифрам
Классическая задача первого месяца обучения: дано трёхзначное число, вывести его цифры по отдельности и найти их сумму. Циклов мы ещё не знаем — и они здесь не нужны, хватает двух операторов.
number = int(input("Введите трёхзначное число: ")) units = number % 10 # единицы: остаток от деления на 10 tens = number // 10 % 10 # десятки: отрезали единицы, взяли остаток hundreds = number // 100 # сотни: отрезали две цифры print(f"Сотни: {hundreds}, десятки: {tens}, единицы: {units}") print(f"Сумма цифр: {hundreds + tens + units}")
Введите трёхзначное число: 254
Сотни: 2, десятки: 5, единицы: 4
Сумма цифр: 11
Разберите строку с десятками внимательно, это ключ ко всей задаче. Операторы // и % имеют одинаковый приоритет и выполняются слева направо, поэтому number // 10 % 10 читается как «сначала убрать единицы — получится 25, — а затем взять последнюю цифру от того, что вышло». Скобки здесь не нужны, но написать (number // 10) % 10 для наглядности не запрещено.
§8Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
print(6 / 3), ожидая 2 | выведет 2.0 — тип результата всегда float | 6 // 3, если нужен int |
x / 0 | ZeroDivisionError: division by zero | деление на ноль недопустимо — проверяйте делитель |
x % 0 или x // 0 | та же ошибка ZeroDivisionError | ноль не годится ни для одного вида деления |
number / 10 для последней цифры | получится 1234.5, а не цифра | для цифр нужны % и //, а не / |
5 // 2.0, ожидая int | выведет 2.0 — один дробный операнд делает дробным результат | int(5 // 2.0) |
-7 // 2, ожидая -3 | получится -4 — округление идёт вниз | для отрицательных проверяйте результат, а не полагайтесь на интуицию |
§9Проверьте себя
Что выведет print(7 / 2, 7 // 2, 7 % 2)?
3.5 3 1. Обычное деление даёт точный дробный ответ, целочисленное — сколько целых двоек поместилось, остаток — что не поместилось.
Почему 10 / 5 даёт 2.0, а не 2?
Потому что оператор / всегда возвращает float, независимо от операндов и от того, делится ли нацело. Целый результат даст 10 // 5.
Как получить вторую цифру с конца у числа 4796?
4796 // 10 % 10 — сначала отрезаем последнюю цифру (получается 479), затем берём остаток от деления на 10, то есть 9.
Как проверить, что число чётное, зная только операции деления?
Взять остаток от деления на два: если number % 2 равно нулю, число чётное. Этот приём — основа проверок делимости, и в следующем модуле мы будем строить на нём условия.
Задача для практики: переведите 3725 секунд в часы, минуты и секунды.
Три строки на тех же двух операторах:
hours = total // 3600— целых часов;minutes = total % 3600 // 60— от остатка берём целые минуты;seconds = total % 60— остаток секунд.
Для 3725 получится 1 час 2 минуты 5 секунд. Порядок тот же, что и с цифрами числа: отрезаем крупное, с остатком работаем дальше.
§10Шпаргалка
45 / 4 # 11.25 точно
45 // 4 # 11 целых
45 % 4 # 1 остаток
/ всегда float
// int, если оба int
n % 10 # последняя
n % 100 # две последние
n // 10 # без последней
n // 100 # без двух
n // 10 % 10
# отрезать, потом взять
n % 2 == 0 # чётное
Итог главы
Три оператора отвечают на три разных вопроса: / — сколько получится в точности (всегда float), // — сколько получится целых, % — сколько осталось. Пара // и % работает вместе: одна отрезает хвост числа, другая его оставляет. Это даёт готовый инструмент для разбора числа по цифрам, перевода единиц измерения и проверки делимости — а проверкой делимости мы займёмся уже в следующем модуле.