Предыдущий урок: Комментарии
В этом материале рассмотрим приоритетность и ассоциативность операторов в Python. Тема очень важна для понимания семантики операторов Python.
После прочтения вы должны понимать, как Python определяет порядок исполнения операторов. У некоторых из них более высокий уровень приоритета. Например, оператор умножения более приоритетный по сравнению с операторами сложения или вычитания.
В выражении интерпретатор Python выполняет операторы с более высоким уровнем приоритета первыми. И за исключением оператора возведения в степень (**
) они выполняются слева направо.
Приоритетность операторов в Python
Как работает приоритетность операторов в Python?
Выражение — это процесс группировки наборов значений, переменных, операторов и вызовов функций. При исполнении таких выражений интерпретатор Python выполняет их.
Вот простейший пример.
>>> 3 + 4
7
Здесь «3 + 4» — это выражение Python. Оно содержит один оператор и пару операндов. Но в более сложных инструкциях операторов может быть и несколько.
Для их выполнения Python руководствуется правилом приоритетности. Оно указывает на порядок операторов.
Примеры приоритетов операторов
В следующих примерах в сложных выражениях объединены по несколько операторов.
# Сначала выполняется умножение
# потом операция сложения
# Результат: 17
5 + 4 * 3
Однако порядок исполнения можно поменять с помощью скобок (). Они переопределяют приоритетность арифметический операций.
# Круглые скобки () переопределяют приоритет арифметических операторов
# Вывод: 27
(5 + 4) * 3
Следующая таблица демонстрирует приоритетность операторов от высокой до самой низкой.
Операторы | Применение |
---|---|
{ } | Скобки (объединение) |
f(args…) | Вызов функции |
x[index:index] | Срез |
x[index] | Получение по индексу |
x.attribute | Ссылка на атрибут |
** | Возведение в степень |
~x | Побитовое нет |
+x, -x | Положительное, отрицательное число |
*, /, % | Умножение, деление, остаток |
+, — | Сложение, вычитание |
<<, >> | Сдвиг влево/вправо |
& | Побитовое И |
^ | Побитовое ИЛИ НЕ |
| | Побитовое ИЛИ |
in, not in, is, is not, <, <=, >, >=, <>, !=, == | Сравнение, принадлежность, тождественность |
not x | Булево НЕ |
and | Булево И |
or | Булево ИЛИ |
lambda | Лямбда-выражение |
Ассоциативность операторов
В таблице выше можно увидеть, что некоторые группы включают по несколько операторов python. Это значит, что все представители одной группы имеют один уровень приоритетности.
При наличии двух или более операторов с одинаковым уровнем в дело вступает ассоциативность, определяющая порядок.
Что такое ассоциативность в Python?
Ассоциативность — это порядок, в котором Python выполняет выражения, включающие несколько операторов одного уровня приоритетности. Большая часть из них (за исключением оператора возведения в степень **
) поддерживают ассоциативность слева направо.
Примеры
Например, у операторов умножения и деления приоритетность одинаковая. В одном выражении тот, что находится слева, будет выполняться первым.
# Тестирование ассоциативности слева направо
print(4 * 7 % 3)
# Результат: 1
print(2 * (10 % 5))
# Результат: 0
Единственное исключение — оператор возведения в степень **
. Вот пример с ним:
# Проверка ассоциативности с оператором степени
print(4 ** 2 ** 2)
# Вывод: 256
print((4 ** 2) ** 2)
# Вывод: 256
Обратите внимание на то , что print(4 ** 2 ** 2)
дает такой же результат, как и ((4 ** 2) ** 2)
.
Неассоциативные операторы
В Python есть такие операторы (например, присваивания и сравнения), которые не поддерживают ассоциативность. Для них применяются специальные правила порядка, в которых ассоциативность не принимает участия.
Например, выражение 5 < 7 < 9
— это не то же самое, что и (5 < 7) < 9
или 5 < (7 < 9)
. Зато 5 < 7 < 9
— то же самое, что 5 < 7
и 7 < 9
. Исполняется слева направо.
Так же работает связывание операторов присваивания (например, a=b=c
), а вот a = b += c
вернет ошибку.
# Установите значения
x = 11
y = 12
# Выражение неверно
# Неассоциативные операторы
# Ошибка -> SyntaxError: invalid syntax
x = y += 12
Выводы
Приоритетность и ассоциативность операторов в Python — важная тема. Зная ее, легче работать со сложными выражениями.
Далее: Генераторы