Модуль 1 · Урок 1.3
Числа и арифметические операции
Целое деление и остаток, отрицательные числа, приоритет операций, точные целые и приближённые дробные.
В прошлом уроке у чисел появились имена, теперь займёмся самими вычислениями. Сложение, вычитание и умножение в Python такие же, как на уроке математики, а с делением интереснее. Сколько полных пятёрок помещается в 23 и сколько остаётся? Для таких вопросов в Python есть две отдельные операции — целое деление // и остаток %. На них держатся проверка делимости, цифры числа и перевод секунд в часы и минуты.
Ещё в уроке — порядок операций, точность дробных чисел и готовые действия: модуль, минимум, максимум и округление.
Семь операций
В Python семь основных арифметических операций. Вот они все на числах 23 и 5, у каждой строки — комментарий с названием:
print(23 + 5) # сложениеprint(23 - 5) # вычитаниеprint(23 * 5) # умножениеprint(23 / 5) # делениеprint(23 // 5) # целое делениеprint(23 % 5) # остатокprint(23 ** 5) # степеньПервые три работают как в математике. ** — степень: 23 ** 5 — это 23⁵, а 2 ** 5 — 2⁵ = 32. Обычное деление / всегда даёт дробное число float, даже если делится нацело: 8 / 2 — это 4.0, а не 4.
Умножение пишут явно: 2 * x, а не 2x. Степень — **, а не ^: знак ^ в Python означает другую операцию.
Целое деление и остаток. 23 // 5 — сколько полных пятёрок помещается в 23: четыре. 23 % 5 — сколько осталось сверх них: 3. Разложи клетки на порции сам:
n // d, клетки, которым не хватило на порцию, — остаток n % d. Меняй числа или выбери пример: при 20 и 5 остатка нет — 20 делится на 5, а при 3 и 7 нет ни одной полной порции.Частное и остаток всегда собираются обратно в исходное число: полные порции, умноженные на размер порции, плюс остаток. Для целых a и b, где b — не ноль, это равенство a = (a // b) * b + a % b:
print(23 // 5 * 5 + 23 % 5)Делить на ноль нельзя и здесь: 23 // 0 и 23 % 0 остановят программу с ZeroDivisionError, как деление на ноль в первом уроке.
Округление вниз
// округляет частное вниз — к меньшему целому. Для положительных чисел это то же, что отбросить дробную часть: 23 / 5 — 4.6, а 23 // 5 — 4. У отрицательных чисел разница видна:
print(-7 / 3)print(-7 // 3)print(int(-7 / 3))int(x) превращает дробное число в целое, отбрасывая дробную часть; подробнее о нём — в уроке «Ввод, преобразование и вывод». Отбросить дробную часть у −2.33… — значит получить −2, то есть сдвинуться к нулю. А округлить вниз — значит взять меньшее целое: −3.
// всегда идёт влево по числовой прямой, к меньшему целому. int() идёт к нулю. Для 4.6 это одно и то же направление, а для −2.33 — противоположные.Поэтому заменять a // b на int(a / b) нельзя: для отрицательных чисел ответы разойдутся.
Тонкости:остаток отрицательного числа
Остаток согласован с частным: -7 % 3 равно 2, потому что −7 = (−3) · 3 + 2. При положительном делителе остаток всегда от 0 до делителя без единицы. Если отрицателен делитель, ненулевой остаток тоже отрицателен: 7 % -3 равно −2. А int(a / b) подводит ещё и на очень больших числах: дробное a / b хранится приближённо (раздел «Точность чисел»).
Порядок операций
Порядок операций такой же, как в математике. Сначала скобки, затем степень **, затем *, /, //, %, затем + и -. Операции одного уровня выполняются слева направо — это касается и // с %: они стоят на одном уровне с умножением.
print(2 + 3 * 4)print((2 + 3) * 4)print(472 // 10 % 10)print(2 ** 3 ** 2)print(-3 ** 2)print((-3) ** 2)472 // 10 % 10 читается слева направо: сначала 472 // 10 = 47, затем 47 % 10 = 7. Этот приём понадобится в разделе о цифрах числа.
Степень — исключение: цепочку ** Python считает справа налево. 2 ** 3 ** 2 — это 2 ** (3 ** 2), то есть 2⁹ = 512. И степень выполняется раньше минуса перед числом: -3 ** 2 — это -(3 ** 2), то есть −9.
Порядок удобно видеть деревом: операция выполняется, когда готовы значения под ней, поэтому нижние операции выполняются первыми.
2 + 3 * 4 умножение стоит ниже сложения и выполняется первым. В цепочке степеней ниже оказывается правая часть, а минус в -3 ** 2 стоит над степенью и применяется к готовому 9.Если сомневаешься в порядке, ставь скобки: (-3) ** 2 или 2 + (3 * 4) читаются сразу, без знания правил.
Точность чисел
Целые числа Python считает точно, а дробные — приближённо. Целое может быть сколь угодно длинным, пока хватает памяти компьютера:
print(2 ** 100)С дробными иначе. float хранит число с ограниченным количеством знаков, поэтому некоторые простые дроби записываются чуть неточно — так же, как 1/3 не записать конечной десятичной дробью 0.333…:
print(0.1 + 0.2)Это не ошибка Python, а свойство дробных чисел в компьютере. Отсюда правило: если задача о целых — количестве, цифрах, делимости, — считай в целых: // и % вместо /.
Тонкости:сравнение дробных
Внутри компьютера float хранится в двоичной записи, а 0.1 в ней — бесконечная дробь, как 1/3 в десятичной. Поэтому проверка 0.1 + 0.2 == 0.3 даёт False. Дробные результаты сравнивают с допуском — функцией math.isclose из урока о стандартной библиотеке; допуск выбирают по смыслу задачи.
Готовые функции
Модуль, минимум, максимум и округление в Python уже готовы. Это функции: записываются они как print — имя, а в скобках значения через запятую.
print(abs(-12))print(min(5, 2, 9))print(max(5, 2, 9))print(round(2.5))print(round(3.5))abs даёт модуль числа, min и max — наименьшее и наибольшее из значений в скобках. round округляет до ближайшего целого. Но при ровной половине — 2.5 или 3.5 — Python выбирает ближайшее чётное: 2.5 превратилось в 2, а 3.5 — в 4. Это правило Python, а не ошибка.
Тонкости:округление до знаков после точки
Вторым значением в скобках round принимает число знаков после точки: round(3.14159, 2) даёт 3.14. Из-за неточности float некоторые «половинки» на деле чуть меньше половины, поэтому round(2.675, 2) даёт 2.67. Поэтому деньги часто считают в целых копейках.
Делимость и цифры
Делимость и цифры числа — это остатки. «n делится на d» значит, что остаток n % d равен нулю. Чётность — остаток от деления на 2: у чётного числа он 0, у нечётного 1.
print(91 % 7)print(18 % 2)print(17 % 2)91 делится на 7, 18 — чётное, 17 — нечётное. Последняя цифра — тоже остаток. Если n — неотрицательное целое, то n % 10 — его последняя цифра, а n // 10 — число без неё. Почему? Любое такое число записывается как 10 * q + r, где r — от 0 до 9, и эти q и r как раз вычисляют две операции. Например, 472 = 10 · 47 + 2:
n = 472print(n % 10)print(n // 10)print(n // 10 % 10)Третья строка сначала отбрасывает последнюю цифру, а затем берёт последнюю цифру того, что осталось, — получается вторая цифра справа. Для цифр отрицательного числа сначала берут abs(n): знак — не цифра.
n % 10 берёт цифру с весом 1, а n // 10 сдвигает остальные на разряд вправо: 47 = 4 · 10 + 7.Те же две операции раскладывают время. В 3671 секунде 1 полный час (3600 секунд), в остатке 71 секунда: из них 1 полная минута и 11 секунд. print с несколькими значениями через запятую печатает их в одну строку через пробел; подробнее — в следующем уроке:
seconds = 3671hours = seconds // 3600minutes = seconds % 3600 // 60remaining_seconds = seconds % 60print(hours, minutes, remaining_seconds)// 3600 — полные часы, % 3600 // 60 — полные минуты из того, что осталось после часов, % 60 — секунды сверх полных минут.Итог
За урок ты прошёл все арифметические операции Python, а целое деление и остаток научился применять к цифрам числа и ко времени. Вот что из этого понадобится дальше.
- Семь операций
+,-,*— как в математике;**— степень;/— деление с дробным ответом;//— целое деление;%— остаток. 23 // 5, 23 % 54 полные пятёрки и 3 в остатке: 23 = 4 · 5 + 3. На ноль делить нельзя —ZeroDivisionError.- Округление вниз
//округляет к меньшему:-7 // 3— −3.int()отбрасывает дробную часть к нулю: −2. - ПорядокСкобки,
**, затем* / // %, затем+ -. Один уровень — слева направо, цепочка**— справа налево;-3 ** 2— −9. - ТочностьЦелые точные,
floatприближённые:0.1 + 0.2— 0.30000000000000004. Задачи о целых считают в целых. - Функции
abs,min,max,round;roundпри ровной половине выбирает чётное. - Делимость и цифрыДелится — значит
n % dравно 0.n % 10— последняя цифра,n // 10— число без неё. - Время
// 3600— часы,% 3600 // 60— минуты,% 60— секунды.
Проверьте себя
Ответь сначала сам, потом открой ответ.
Что напечатают print(17 // 5) и print(17 % 5)?
ОтветСкрыть ответ
3 и 2: в 17 помещаются три полные пятёрки, и 2 остаётся. Проверка: 17 = 3 · 5 + 2.
Почему print(10 / 2) печатает 5.0, а не 5? Как получить целое 5?
ОтветСкрыть ответ
Обычное деление / всегда даёт дробное float, даже нацело. Целое 5 даёт 10 // 2.
Чему равно -9 // 2? А int(-9 / 2)?
ОтветСкрыть ответ
−5 и −4: -9 / 2 — это −4.5; // округляет вниз, к меньшему целому, а int отбрасывает дробную часть, к нулю.
Что напечатает print(2 + 10 // 4 * 3)?
ОтветСкрыть ответ
8: // и * — на одном уровне, слева направо: 10 // 4 = 2, 2 * 3 = 6, и только потом 2 + 6.
Какими выражениями узнать последнюю цифру числа 2026 и проверить, чётное ли оно? Что они дадут?
ОтветСкрыть ответ
2026 % 10 — последняя цифра 6; 2026 % 2 — 0, значит, число чётное.
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Что напечатает программа?
print(200 // 7)print(200 % 7)Запишите напечатанные числа через пробел в порядке вывода.
Подсказка
// — сколько полных семёрок помещается в 200, % — сколько осталось сверх них.
Разбор
В 200 помещается 28 полных семёрок: 28 · 7 = 196. Остаток 200 − 196 = 4. Проверка: 200 = 28 · 7 + 4.
Ответ: 28 4
Что напечатает программа?
print(-17 // 5)print(-17 % 5)print(int(-17 / 5))Запишите напечатанные числа через пробел в порядке вывода.
Подсказка
−17 / 5 = −3.4. // округляет вниз, к меньшему целому; int отбрасывает дробную часть, к нулю. Остаток собирает число обратно: −17 = 5 · частное + остаток.
Разбор
-17 // 5 округляет −3.4 вниз: −4. Остаток: −17 − 5 · (−4) = 3. int(-17 / 5) отбрасывает дробную часть: −3.
Ответ: -4 3 -3
Что напечатает программа?
print(2 + 3 * 4 ** 2)print(-2 ** 4)print((-2) ** 4)Запишите напечатанные числа через пробел в порядке вывода.
Подсказка
Степень выполняется раньше умножения и раньше минуса перед числом.
Разбор
4 ** 2 = 16, 3 * 16 = 48, 2 + 48 = 50. -2 ** 4 — это -(2 ** 4) = −16. В скобках минус относится к числу: (-2) ** 4 = 16.
Ответ: 50 -16 16
Что напечатает программа?
n = 9051print(n % 10)print(n // 10)print(n // 10 % 10)Запишите напечатанные числа через пробел в порядке вывода.
Подсказка
% 10 — последняя цифра, // 10 — число без неё. Третья строка читается слева направо.
Разбор
Последняя цифра 9051 — 1, без неё остаётся 905. Третья строка берёт последнюю цифру 905 — это 5, вторая цифра справа.
Ответ: 1 905 5
Что напечатает программа?
print(round(4.5))print(round(5.5))print(round(-2.5))Запишите напечатанные числа через пробел в порядке вывода.
Подсказка
При ровной половине round выбирает ближайшее чётное целое.
Разбор
4.5 — между 4 и 5, чётное 4. 5.5 — между 5 и 6, чётное 6. −2.5 — между −3 и −2, чётное −2.
Ответ: 4 6 -2
Делится ли 1001 на 7?
Чтобы узнать, делится ли 1001 на 7, программа печатает остаток. Что она напечатает?
print(1001 % 7)Введите число.
Подсказка
Число делится на 7, если остаток от деления на 7 равен нулю. Проверь: 7 · 143.
Разбор
7 · 143 = 1001, поэтому остаток 0 — 1001 делится на 7.
Ответ: 0
Сколько полных недель и оставшихся дней в 100 днях?
Запишите два числа через пробел: сначала полные недели, затем оставшиеся дни.
Подсказка
В неделе 7 дней: полные недели — целое деление на 7, оставшиеся дни — остаток.
Разбор
100 // 7 = 14 полных недель (98 дней), 100 % 7 = 2 дня.
Ответ: 14 2
Напиши программу: 100000 секунд — это сколько суток, часов, минут и секунд?
Напиши программу, которая раскладывает 100000 секунд на полные сутки, часы, минуты и секунды и печатает четыре числа одним print через запятую. В сутках 86400 секунд. Запусти программу и запиши, что она напечатала.
Запишите напечатанную строку: четыре числа через пробел.
Подсказка
Как в разложении 3671 секунды из урока: сутки — // 86400, часы — % 86400 // 3600, минуты — % 3600 // 60, секунды — % 60.
Разбор
Например:
seconds = 100000days = seconds // 86400hours = seconds % 86400 // 3600minutes = seconds % 3600 // 60remaining_seconds = seconds % 60print(days, hours, minutes, remaining_seconds)100000 = 86400 + 3 · 3600 + 46 · 60 + 40.
Ответ: 1 3 46 40