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

Представьте взрослого с 17 яблоками и пятерых детей. Он раздаёт яблоки по одному каждому по кругу, пока хватает на всех. Каждый ребёнок получает по три яблока, а два остаются у взрослого в руке.
У такой раздачи два ответа: сколько досталось каждому и сколько осталось. На доске взрослый пишет 17 // 5 — это три яблока каждому. Два лишних яблока он помечает биркой 17 % 5.
Сложение, вычитание и умножение в 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Давайте разберём программу по строкам:
- Первые две строки кладут в переменные число яблок и число детей.
- Третья строка печатает
22 12 85: сумму, разность и произведение, как на калькуляторе. apples / kidsпечатает3.4: столько получит каждый, если резать яблоки на дольки.apples // kidsпечатает3: столько целых яблок достанется каждому ребёнку.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 делит и отрицательные числа. Из того же правила следует, что знак остатка совпадает со знаком делителя — правого операнда:
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Разберём каждую строку:
- Первая печатает
3.0 3 -4:/далfloat, а//округлил-3.5вниз, до-4. - Во второй
-7 % 3— это2. Проверьте:-7 // 3— это-3, а-3 * 3 + 2— это-7. - Там же
7 % -3— это-2: делитель отрицательный, поэтому и остаток отрицательный. - Третья разбирает число на цифры:
n % 10— последняя цифра, аn // 10— число без неё.
Пройдите программу по шагам и следите за q и r: на каждой проверке они снова собираются в n.
1n = 172d = 53q = n // d4r = n % d5x = n / d6print(q, r, x)7print(q * d + r == n)8n = -79d = 210q = n // d11r = n % d12print(q, r)13print(q * d + r == n)
n — сколько яблок: 17.
Этот вопрос часто задают на собеседовании: «Чему равны -7 // 2 и -7 % 3?» Ответ всегда выводится из правила a // b * b + a % b == a и округления вниз.
Ещё два правила о делении:
- если хоть один операнд
//или%имеет типfloat, результат тожеfloat:7.0 // 2— это3.0; - делитель, равный нулю, останавливает программу с ошибкой
ZeroDivisionError.
Степень и порядок действий
Оператор ** возводит в степень: 2 ** 10 — это 1024, а 2 ** 0.5 — квадратный корень из двух. Приоритет определяет, какой оператор выполняется раньше. Уровни идут так:
**;*,/,//и%;+и-.
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). Чтобы возвести в квадрат отрицательное число, его берут в скобки.
Частая ошибка
Среднее двух чисел записывают без скобок:
a = 4
b = 6
average = a + b / 2 # ✗
print(average) # 7.0Python не сообщает об ошибке: деление выполнилось раньше сложения, и получилось 4 + 3.0. Сумму нужно взять в скобки: (a + b) / 2 даёт 5.0.
Главное
/всегда даётfloat, а//округляет частное вниз, к минус бесконечности.%даёт остаток, иa // b * b + a % bвсегда равноa; знак остатка — как у делителя.- Первым выполняется
**, затем*,/,//и%, последними —+и-.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.