Python: Приоритет
Рассмотрим простое выражение:
print(2 + 2 * 2) # => 6Результат равен 6, а не 8. Это объясняется понятием приоритета операций в математике и программировании. Он определяет порядок, в котором выполняются действия:
- Умножение и деление выполняются раньше сложения и вычитания.
- Возведение в степень (**) имеет еще более высокий приоритет.
Приоритет операций (от высокого к низкому):
** возведение в степень
↓
* / // % умножение, деление, остаток
↓
+ - сложение, вычитаниеНапример:
print(2 * 2 ** 3) # => 16, потому что сначала 2 ** 3 = 8, затем 8 * 2 = 16Если рядом идут операции с одинаковым приоритетом, они выполняются слева направо:
print(8 / 2 * 3) # => 12, потому что сначала 8 / 2 = 4, затем 4 * 3 = 12Управление порядком действий
Иногда нужно изменить порядок вычислений. Для этого используются круглые скобки. Они позволяют задать, какие действия нужно выполнить в первую очередь:
print((2 + 2) * 2) # => 8Скобки можно ставить вокруг любой части выражения и вкладывать их друг в друга:
print(3 ** (4 - 2)) # => 9
print(7 * 3 + (4 / 2) - (8 + (2 - 1))) # => 14Главное правило: всегда закрывайте скобки. Непарные скобки вызывают ошибки: и новички, и опытные программисты иногда забывают про закрывающую скобку.
Пишите скобки сразу парой. Например, вводите () и потом заполняйте внутреннюю часть. Большинство редакторов кода (в том числе наш) автоматически добавляют закрывающую скобку, как только вы пишете открывающую.
Повышаем читаемость
Иногда выражение работает правильно, но выглядит запутанно. В таких случаях скобки можно добавить просто для наглядности: они не изменят результат, но улучшат восприятие.
# Было
print(8 / 2 + 5 - -3 / 2) # => 10.5
# Стало
print(((8 / 2) + 5) - (-3 / 2)) # => 10.5Программы пишут люди, и читают их тоже люди. Компьютеру все равно, насколько понятно написан код: достаточно, чтобы он был синтаксически правильным. Для человека понятный и аккуратный код является залогом удобства, особенно при работе в команде или разборе ошибок.
Задание
Вы с 4 друзьями (итого 5 человек) заказали 2 пиццы по 300 рублей и 4 напитка по 50 рублей. Нужно разделить счет поровну.
Запишите программу из одной строки с print(), расставив скобки так, чтобы сначала посчиталась общая сумма, а затем делилась на всех:
без скобок: 2 * 300 + 4 * 50 / 5 = 640.0 ← неверно
со скобками: (2 * 300 + 4 * 50) / 5 = 160.0 ← верноВаше упражнение проверяется по этим тестам
import importlib
def test(capsys):
expected = "160.0"
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
