Python: Композиция операций
В Python, как и в математике, можно объединять несколько операций в одну строку. Такие выражения интерпретатор обрабатывает шаг за шагом, по определенным правилам.
Рассмотрим пример:
print(2 * 4 * 5 * 10)Этот код состоит из нескольких операций умножения, объединенных в одно выражение. Чтобы понять, как интерпретатор выполняет выражение, разберем его по этапам:
- Сначала вычисляется
2 * 4:8 * 5 * 10 - Затем
8 * 5:40 * 10 - И наконец
40 * 10:400
Итоговый результат составляет 400.
А если разные операции?
Все просто, пока используются одинаковые операторы. Но что произойдет, если объединить, например, умножение и сложение?
print(2 + 3 * 4)2 + 3 * 4
└─┬─┘
2 + 12
└──┬───┘
14Получится ли 20 или 14? Ответ: 14.
Это объясняется тем, что в Python, как и в математике, у операций есть приоритет. Умножение выполняется раньше сложения, если не использовать скобки. Мы разберем это подробнее в уроке про приоритеты.
Примеры с вычитанием и отрицательными числами
То же правило работает и для вычитания:
print(10 - 2 * 3) # => 4Сначала выполняется умножение: 10 - 6 = 4.
Если же в выражении есть отрицательные числа, унарный минус применяется уже после возведения в степень:
print(-2 ** 2) # => -4, два в степени два, затем применяется минус
print(-2 * 5) # => -10, минус два умноженное на пять
print(4 + -2) # => 2
print(6 - -2) # => 8Во всех примерах, кроме первого, сначала вычисляется унарный минус (-2), и затем проводятся остальные операции.
Рассмотрим подробнее последний пример:
print(6 - -2) # => 8Сначала вычисляется унарный минус (-2), и затем операция превращается в 6 - (-2), что дает 8. Это то же самое, что:
print(6 + 2) # => 8Что нужно запомнить
- Выражения могут состоять из нескольких операций.
- Python вычисляет их поэтапно: слева направо, соблюдая приоритет операций.
- Скобки можно использовать, чтобы явно указать порядок вычислений.
Задание
Вы идете в магазин за подарками: 3 книги по 200 рублей и 2 ручки по 30 рублей. Рассчитайте и выведите итоговую стоимость покупки.
3 * 200 + 2 * 30
↓ ↓
600 + 60 = 660Ваше упражнение проверяется по этим тестам
import importlib
def test(capsys):
expected = "660"
expect_output(capsys, expected)
def expect_output(capsys, expected):
importlib.import_module('solution')
out, _err = capsys.readouterr()
actual = out.strip('\n')
with capsys.disabled():
print('\n')
print(out)
assert actual == expectedРешение учителя откроется через:
20:00
