Модуль 1 · Данные и имена

Справочник по Python · модуль 1 · данные и имена

Глава 1.8

1.8

Операции деления:
/, // и %

Деления в Python три, и это не прихоть языка: у задачи «разделить» бывает три разных ответа. Сколько получится в точности, сколько получится целых и сколько осталось — на каждый вопрос свой оператор. Пара // и % вдобавок умеет то, чего от арифметики не ждёшь: разбирать число по цифрам.

Категория
Синтаксис и базовые концепции
Уровень
Начальный
Связанные темы
Типы данных, условия, циклы
Зачем это знать
Выбирать нужный вид деления и работать с цифрами числа

§1Три вида деления

Разделить 45 на 4 можно тремя способами, и все три нужны на практике.

ОператорНа какой вопрос отвечает45 и 4Тип результата
/сколько получится в точности11.25всегда float
//сколько получится целых11int, если оба целые
%сколько осталось1int, если оба целые

Житейская проверка: 45 конфет на 4 человек. Каждому достанется по 11 штук (//), одна останется в вазе (%), а «по 11.25 конфеты» (/) — ответ математически верный, но конфету так не поделишь. Выбор оператора — это выбор того, какой ответ вам нужен.

§2/ — обычное деление

Оператор / выполняет обычное математическое деление. Его результат всегда имеет тип float — даже когда делятся два целых числа и делятся нацело.

main.pyобычное деление
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. Отсюда живучая путаница в старых примерах из интернета — если код ведёт себя не так, как описано в статье, посмотрите на год публикации.

Второе, о чём стоит помнить: результат деления часто оказывается бесконечной дробью.

main.pyпериодическая дробь
print(1 / 3)   # 0.3333333333333333

Полная точность здесь недостижима — компьютер хранит ограниченное число разрядов. Поэтому результат либо округляют при выводе (f"{x:.2f}"), либо, если дробная часть вообще не нужна, берут другой оператор.

§3// — деление без остатка

Оператор // выполняет целочисленное деление: возвращает целую часть результата, отбрасывая дробную.

main.pyцелочисленное деление
print(5 // 2)    # 2
print(6 // 3)    # 2
print(45 // 4)   # 11

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

main.pyдостаточно одного float
print(5 // 2.0)   # 2.0
print(5.0 // 2)   # 2.0

Если целый результат нужен обязательно — приведите его явно: int(5.0 // 2) даст 2. Это тот же приём, что и в главе о вводе: язык не догадывается за вас, какой тип нужен на выходе.

§4% — остаток от деления

Оператор % возвращает остаток от деления — то, что не поместилось в целые части.

main.pyостаток
print(10 % 3)   # 1

Проверить результат легко по школьной записи деления с остатком: 10 = 3 * 3 + 1. Тройка помещается в десятке три раза, единица остаётся. Именно эту единицу и вернул оператор.

Операторы // и % — пара: первый отвечает, сколько раз поместилось, второй — сколько осталось. Вместе они решают целый класс бытовых задач.

main.pyсекунды в минуты и секунды
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 — это последняя цифра числа.

main.pyпоследняя цифра
number = 12345
last_digit = number % 10

print(last_digit)   # 5

Логика прозрачна: 12345 — это 1234 десятка и ещё 5. Десятки делятся на 10 нацело, а единицы остаются в остатке. Увеличивая делитель, мы забираем больше цифр с конца:

ВыражениеРезультат для 12345Что получили
number % 105последняя цифра
number % 10045последние две цифры
number % 1000345последние три цифры

§6// отрезает последние цифры

Целочисленное деление работает зеркально: оно убирает цифры с конца.

main.pyубрать последнюю цифру
number = 12345
without_last = number // 10

print(without_last)   # 1234
ВыражениеРезультат для 12345Что получили
number // 101234без последней цифры
number // 100123без двух последних
number // 100012без трёх последних

Запомнить пару легко по действию: % оставляет хвост, // его отрезает. Комбинируя их, можно достать любую цифру числа — сначала отрезать всё лишнее справа, потом взять остаток.

§7Разбор задачи: число по цифрам

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

main.pyполная программа
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
Введите трёхзначное число: 254
Сотни: 2, десятки: 5, единицы: 4
Сумма цифр: 11

Разберите строку с десятками внимательно, это ключ ко всей задаче. Операторы // и % имеют одинаковый приоритет и выполняются слева направо, поэтому number // 10 % 10 читается как «сначала убрать единицы — получится 25, — а затем взять последнюю цифру от того, что вышло». Скобки здесь не нужны, но написать (number // 10) % 10 для наглядности не запрещено.

§8Частые ошибки

Что написаноЧто произойдётКак правильно
print(6 / 3), ожидая 2выведет 2.0 — тип результата всегда float6 // 3, если нужен int
x / 0ZeroDivisionError: 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), // — сколько получится целых, % — сколько осталось. Пара // и % работает вместе: одна отрезает хвост числа, другая его оставляет. Это даёт готовый инструмент для разбора числа по цифрам, перевода единиц измерения и проверки делимости — а проверкой делимости мы займёмся уже в следующем модуле.

Глава 1.8 · Операции деления: /, // и % · Справочник по Python Автор: Макаров Максим Николаевич