К содержанию

Модуль 1 · Урок 1.3

Числа и арифметические операции

Целое деление и остаток, отрицательные числа, приоритет операций, точные целые и приближённые дробные.

8 задач

В прошлом уроке у чисел появились имена, теперь займёмся самими вычислениями. Сложение, вычитание и умножение в 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)  # степень
28 18 115 4.6 4 3 6436343

Первые три работают как в математике. ** — степень: 23 ** 5 — это 23⁵, а 2 ** 5 — 2⁵ = 32. Обычное деление / всегда даёт дробное число float, даже если делится нацело: 8 / 2 — это 4.0, а не 4.

Умножение пишут явно: 2 * x, а не 2x. Степень — **, а не ^: знак ^ в Python означает другую операцию.

Целое деление и остаток. 23 // 5 — сколько полных пятёрок помещается в 23: четыре. 23 % 5 — сколько осталось сверх них: 3. Разложи клетки на порции сам:

5555323 // 5 = 4— полные порции23 % 5 = 3— остаток
Клетки числа n разложены порциями по d: полные порции — частное 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

Делить на ноль нельзя и здесь: 23 // 0 и 23 % 0 остановят программу с ZeroDivisionError, как деление на ноль в первом уроке.

Округление вниз

// округляет частное вниз — к меньшему целому. Для положительных чисел это то же, что отбросить дробную часть: 23 / 5 — 4.6, а 23 // 5 — 4. У отрицательных чисел разница видна:

print(-7 / 3)print(-7 // 3)print(int(-7 / 3))
-2.3333333333333335 -3 -2

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)
14 20 7 512 -9 9

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)
1267650600228229401496703205376

С дробными иначе. float хранит число с ограниченным количеством знаков, поэтому некоторые простые дроби записываются чуть неточно — так же, как 1/3 не записать конечной десятичной дробью 0.333…:

print(0.1 + 0.2)
0.30000000000000004

Это не ошибка 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))
12 2 9 2 4

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)
0 0 1

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)
2 47 7

Третья строка сначала отбрасывает последнюю цифру, а затем берёт последнюю цифру того, что осталось, — получается вторая цифра справа. Для цифр отрицательного числа сначала берут abs(n): знак — не цифра.

Каждая цифра записи весит своё: 472 = 4 · 100 + 7 · 10 + 2 · 1. 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)
1 1 11
Каждая операция отделяет свою часть: // 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 — секунды.

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1

Что напечатают print(17 // 5) и print(17 % 5)?

ОтветСкрыть ответ
Ответ

3 и 2: в 17 помещаются три полные пятёрки, и 2 остаётся. Проверка: 17 = 3 · 5 + 2.

Вопрос 2

Почему print(10 / 2) печатает 5.0, а не 5? Как получить целое 5?

ОтветСкрыть ответ
Ответ

Обычное деление / всегда даёт дробное float, даже нацело. Целое 5 даёт 10 // 2.

Вопрос 3

Чему равно -9 // 2? А int(-9 / 2)?

ОтветСкрыть ответ
Ответ

−5 и −4: -9 / 2 — это −4.5; // округляет вниз, к меньшему целому, а int отбрасывает дробную часть, к нулю.

Вопрос 4

Что напечатает print(2 + 10 // 4 * 3)?

ОтветСкрыть ответ
Ответ

8: // и * — на одном уровне, слева направо: 10 // 4 = 2, 2 * 3 = 6, и только потом 2 + 6.

Вопрос 5

Какими выражениями узнать последнюю цифру числа 2026 и проверить, чётное ли оно? Что они дадут?

ОтветСкрыть ответ
Ответ

2026 % 10 — последняя цифра 6; 2026 % 2 — 0, значит, число чётное.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Что напечатает программа?

print(200 // 7)print(200 % 7)

Запишите напечатанные числа через пробел в порядке вывода.

Что напечатает программа?

print(-17 // 5)print(-17 % 5)print(int(-17 / 5))

Запишите напечатанные числа через пробел в порядке вывода.

Что напечатает программа?

print(2 + 3 * 4 ** 2)print(-2 ** 4)print((-2) ** 4)

Запишите напечатанные числа через пробел в порядке вывода.

Что напечатает программа?

n = 9051print(n % 10)print(n // 10)print(n // 10 % 10)

Запишите напечатанные числа через пробел в порядке вывода.

Что напечатает программа?

print(round(4.5))print(round(5.5))print(round(-2.5))

Запишите напечатанные числа через пробел в порядке вывода.

Делится ли 1001 на 7?

Чтобы узнать, делится ли 1001 на 7, программа печатает остаток. Что она напечатает?

print(1001 % 7)

Введите число.

Сколько полных недель и оставшихся дней в 100 днях?

Запишите два числа через пробел: сначала полные недели, затем оставшиеся дни.

Напиши программу: 100000 секунд — это сколько суток, часов, минут и секунд?

Напиши программу, которая раскладывает 100000 секунд на полные сутки, часы, минуты и секунды и печатает четыре числа одним print через запятую. В сутках 86400 секунд. Запусти программу и запиши, что она напечатала.

Запишите напечатанную строку: четыре числа через пробел.