Операторы и их приоритеты
До сих пор мы рассматривали каждого оператора так, как будто он не имеет связи с остальными. Очевидно, что такая идеальная и простая ситуация является редкостью в реальном программировании.
Кроме того, вы очень часто найдете более одного оператора в одном выражении, и тогда всё уже не так просто.
Рассмотрим следующее выражение:
2 + 3 * 5
Вы, наверное, помните из школы, что сначала надо выполнить умножение, а затем сложение.
Вы наверняка помните, что сначала вы должны умножить 3 на 5 и, оставив 15 в своей памяти, затем добавить его к 2, получив, таким образом, результат 17.
Явление, которое заставляет некоторых операторов действовать раньше других, известно как иерархия приоритетов.
Python точно определяет приоритеты всех операторов и предполагает, что операторы с более высоким приоритетом выполняют свои операции перед операторами с более низким приоритетом.
Итак, если вы знаете, что *
имеет более высокий приоритет, чем +
, вычисление окончательного результата должно быть очевидным.
Операторы и их порядок действий
Ассоциативность определяет порядок вычислений, выполняемых некоторыми операторами с одинаковым приоритетом, помещенными рядом в одном выражении.
Большинство операторов Python имеют левостороннюю ассоциативность, что означает, что вычисление выражения выполняется слева направо.
Этот простой пример покажет вам, как это работает. Посмотрите:
print(9 % 6 % 2)
Есть два возможных способа оценки этого выражения:
- слева направо: сначала
9%6
равно3
, и затем3%2
равно1
; - справа налево: сначала
6%2
равно0
, и затем9%0
вызывает фатальную ошибку.
Запустите пример и посмотрите, что вы получите.
Результат должен быть 1
. Этот оператор имеет левую ассоциативность. Но есть одно интересное исключение.