В языках программирования и в математике вычисление выражений производится в определенном порядке. Порядок этот задается приоритетом операторов и скобками. Со школы мы знаем, что умножение имеет более высокий приоритет, чем сложение, поэтому в пределах одних скобок сначала будет выполнено умножение, а затем только сложение:
2 * 2 + 2 = 6
Рассмотрим таблицу приоритета операций в языке Python. Сверху таблицы самые приоритетные операции, снизу – операции с низким приоритетом.
Операция | Описание |
( ) | Скобки |
** | Экспонента (возведение в степень) |
+x, -x, ~x | Унарные плюс, минус и битовое отрицание |
*, /, //, % | Умножение, деления, взятие остатка |
+, — | Сложение и вычитание |
<<, >> | Битовые сдвиги |
& | Битовое И |
^ | Битовое исключающее ИЛИ (XOR) |
| | Битовое ИЛИ |
==, !=, >, >=, <, <=, is, is not, in, not in | Сравнение, проверка идентичности, проверка вхождения |
not | Логическое НЕ |
and | Логическое И |
or | Логическое ИЛИ |
Как видно, скобки самые главные. Скобки решают все.
Если в одном выражении идут операторы одинакового приоритета, то вычисления выполняются слева направо.
Исключение составляет оператор **. Он право-ассоциативный. Т.е. в цепочке из двух ** сначала выполнится правый, а потом левый.
>>> 3 ** 4 ** 2
43046721
>>> 3 ** (4 ** 2)
43046721
>>> (3 ** 4) ** 2
6561
Обратите внимание на приоритеты not, and и or.
not a or b and c === (not a) or (b and c)
Правила хорошего тона: не составляйте очень сложных выражений и логических выражений; всегда разбивайте их на части. Даже если вы прекрасно знаете приоритеты операций, то программист, читающий ваш код после вас, может знать их плохо; поэтому НЕ пренебрегайте скобками.
В случае с операторами сравнения, помните про цепочки сравнений!
x < y < z
это ни (x < y) < z,
ни x < (y < z),
а x < y and y < z
Специально для канала @pyway.