Перейти к содержимому
Теория · Операторы · урок 1 из 9

Арифметика и деление

Чему вы научитесь

Чему вы научитесь:

  • находить частное и остаток операторами // и % и помнить, что / всегда даёт float;
  • объяснять, почему 0.1 + 0.2 не равно 0.3, и сравнивать дробные числа через math.isclose;
  • соединять условия операторами and, or и not и знать, что они возвращают;
  • считать выполненные условия, складывая True и False как числа.
Взрослый делит 17 яблок между пятью детьми, каждому по три, и два яблока с биркой 17 % 5 остаются у него

Представьте взрослого с 17 яблоками и пятерых детей. Он раздаёт яблоки по одному каждому по кругу, пока хватает на всех. Каждый ребёнок получает по три яблока, а два остаются у взрослого в руке.

У такой раздачи два ответа: сколько досталось каждому и сколько осталось. На доске взрослый пишет 17 // 5 — это три яблока каждому. Два лишних яблока он помечает биркой 17 % 5.

Сложение, вычитание и умножение в Python работают как на калькуляторе. С делением иначе: у него три оператора, и каждый отвечает на свой вопрос.

Python
apples = 17
kids = 5
print(apples + kids, apples - kids, apples * kids)  # 22 12 85
print(apples / kids)  # 3.4
print(apples // kids)  # 3
print(apples % kids)  # 2

Давайте разберём программу по строкам:

  1. Первые две строки кладут в переменные число яблок и число детей.
  2. Третья строка печатает 22 12 85: сумму, разность и произведение, как на калькуляторе.
  3. apples / kids печатает 3.4: столько получит каждый, если резать яблоки на дольки.
  4. apples // kids печатает 3: столько целых яблок достанется каждому ребёнку.
  5. apples % kids печатает 2: столько яблок останется у взрослого.

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

Значения, с которыми работает оператор, называются операндами. В записи 17 // 5 операнды — 17 и 5. Каждый из трёх операторов деления разберём отдельно.

Обычное деление /

Оператор / всегда даёт float, даже когда операнды делятся нацело: 6 / 2 — это 3.0, а не 3. Тип результата не зависит от чисел, поэтому / выбирают, когда нужна дробь.

Целочисленное деление //

Целочисленное деление // округляет частное вниз, к минус бесконечности. Для положительных чисел это то же, что отбросить дробную часть. Для отрицательных — нет: -7 / 2 — это -3.5, а -7 // 2 — это -4, меньшее из двух соседних целых.

Остаток %

Оператор % даёт остаток от деления — те яблоки, что остались в руке. Остаток от деления на 2 отвечает, чётное ли число: 8 % 2 — это 0, а 7 % 2 — это 1.

Частное и остаток вместе

// и % — две половины одного деления. Python связывает их так, что a // b * b + a % b всегда равно a. Для яблок это 3 * 5 + 2, то есть снова 17: розданные яблоки вместе с остатком дают столько, сколько было.

Здесь аналогия заканчивается: отрицательных яблок не бывает, а Python делит и отрицательные числа. Из того же правила следует, что знак остатка совпадает со знаком делителя — правого операнда:

Python
print(6 / 2, 7 // 2, -7 // 2)  # 3.0 3 -4
print(-7 % 3, 7 % -3)  # 2 -2
print(253 % 10, 253 // 10)  # 3 25

Разберём каждую строку:

  1. Первая печатает 3.0 3 -4: / дал float, а // округлил -3.5 вниз, до -4.
  2. Во второй -7 % 3 — это 2. Проверьте: -7 // 3 — это -3, а -3 * 3 + 2 — это -7.
  3. Там же 7 % -3 — это -2: делитель отрицательный, поэтому и остаток отрицательный.
  4. Третья разбирает число на цифры: n % 10 — последняя цифра, а n // 10 — число без неё.

Пройдите программу по шагам и следите за q и r: на каждой проверке они снова собираются в n.

ВживуюЧастное, остаток и обычное делениешаг 1 из 13 · рамок: 1

n — сколько яблок: 17.

Следите, как q и r снова дают n

Этот вопрос часто задают на собеседовании: «Чему равны -7 // 2 и -7 % 3?» Ответ всегда выводится из правила a // b * b + a % b == a и округления вниз.

Ещё два правила о делении:

  • если хоть один операнд // или % имеет тип float, результат тоже float: 7.0 // 2 — это 3.0;
  • делитель, равный нулю, останавливает программу с ошибкой ZeroDivisionError.

Степень и порядок действий

Оператор ** возводит в степень: 2 ** 10 — это 1024, а 2 ** 0.5 — квадратный корень из двух. Приоритет определяет, какой оператор выполняется раньше. Уровни идут так:

  1. **;
  2. *, /, // и %;
  3. + и -.
Python
print(2 + 3 * 4, (2 + 3) * 4)  # 14 20
print(2 ** 10, 2 ** 0.5)  # 1024 1.4142135623730951
print(-2 ** 2, (-2) ** 2)  # -4 4

Операторы одного уровня, кроме **, выполняются слева направо: 20 // 3 * 2 — это 6 * 2, то есть 12. ** выполняется справа налево: 2 ** 3 ** 2 — это 2 ** 9, то есть 512. Скобки меняют порядок, как в математике.

** выполняется даже раньше минуса перед числом, поэтому -2 ** 2 — это -(2 ** 2). Чтобы возвести в квадрат отрицательное число, его берут в скобки.

Частая ошибка

Среднее двух чисел записывают без скобок:

Python
a = 4
b = 6
average = a + b / 2  # ✗
print(average)  # 7.0

Python не сообщает об ошибке: деление выполнилось раньше сложения, и получилось 4 + 3.0. Сумму нужно взять в скобки: (a + b) / 2 даёт 5.0.

Главное

  • / всегда даёт float, а // округляет частное вниз, к минус бесконечности.
  • % даёт остаток, и a // b * b + a % b всегда равно a; знак остатка — как у делителя.
  • Первым выполняется **, затем *, /, // и %, последними — + и -.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом