№29 Приоритетность и ассоциативность операторов / для начинающих

Предыдущий урок: Комментарии

В этом материале рассмотрим приоритетность и ассоциативность операторов в Python. Тема очень важна для понимания семантики операторов Python.

После прочтения вы должны понимать, как Python определяет порядок исполнения операторов. У некоторых из них более высокий уровень приоритета. Например, оператор умножения более приоритетный по сравнению с операторами сложения или вычитания.

В выражении интерпретатор Python выполняет операторы с более высоким уровнем приоритета первыми. И за исключением оператора возведения в степень (**) они выполняются слева направо.

Приоритетность операторов в Python

Как работает приоритетность операторов в Python?

Выражение — это процесс группировки наборов значений, переменных, операторов и вызовов функций. При исполнении таких выражений интерпретатор Python выполняет их.

Вот простейший пример.

Здесь «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 — важная тема. Зная ее, легче работать со сложными выражениями.

Далее: Генераторы