Module (56%)
Section (70%)

Операторы и их приоритеты

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

Кроме того, вы очень часто найдете более одного оператора в одном выражении, и тогда всё уже не так просто.

Рассмотрим следующее выражение:

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. Этот оператор имеет левую ассоциативность. Но есть одно интересное исключение.