В этой статье мы рассмотрим приоритет и ассоциативность операторов в Python. Тема очень важна для понимания семантики операторов Python.
Прочитав это, вы должны понять, каким образом осуществляет определение порядка выполнения тех или иных инструкций. Некоторые из них имеют более высокий уровень приоритета. Например, оператор умножения имеет приоритет над операторами сложения или вычитания, насколько мы знаем из школьных уроков математики. Такой же принцип сохраняется и в разработке приложений на Python.
В выражении интерпретатор Python сначала выполняет инструкции с более высоким приоритетом. И за исключением оператора возведения в степень (**), они выполняются слева направо.
- Что такое операторы в Python?
- Арифметические операторы
- Операторы сравнения
- Операторы присваивания
- Логические операторы
- Операторы принадлежности
- Операторы тождественности
- Битовые операторы
- Более подробно о приоритетности операторов в Python
- Каким образом работает приоритетность операторов в Python?
- Приоритеты операторов – примеры
- Таблица приоритетности операторов
- Ассоциативность операторов
- Понятие ассоциативности в Python
- Примеры ассоциативности
- Неассоциативные операторы – что это такое?
- Заключение
Что такое операторы в Python?
Перед тем, как разбирать вопросы приоритетности и ассоциативности операторов, давайте восстановим в памяти, что такое операторы вообще. Под оператором в Python подразумевается специальный символ, который выполняет определенную операцию над переменными либо значениями, которые расположены рядом с ним.
Операторы в Python бывают следующих видов:
- Арифметические.
- Операторы сравнения.
- Операторы присваивания.
- Логические операторы.
- Операторы принадлежности.
- Битовые операторы.
- Операторы тождественности.
Давайте разберемся подробнее в том, какие типы бывают.
Арифметические операторы
Это стандартные операторы Python, большая часть которых похожа на своих математических «сородичей».
- Оператор сложения + – суммирует два операнда, которые находятся рядом.
- Вычитание (-) – из первого операнда вычитает значение второго.
- Умножение (*). Выполняет умножение значений, которые расположены по обе стороны оператора.
- Деление (/). Операнд, расположенный слева от оператора разделяет на тот, который размещается справа.
- Возведение в степень (**) – умножает первое число на себя количество раз, указанное во втором операнде. Простыми словами, выполняет классическую операцию возведения в степень.
- Деление по модулю (%). Позволяет получить остаток от операции деления.
- Деление без остатка (//). Дает возможность получить целочисленное значение частного, убирая цифры после десятичной точки.
Операторы сравнения
Используются для того, чтобы сравнивать операнды между собой. Чтобы проверить, какой из них является большим или меньшим либо равным, необходимо использовать соответствующий оператор. Давайте рассмотрим операторы сравнения, которые могут использоваться в Python:
- Меньше. Обозначается знаком <. Если число слева меньше, чем справа, возвращается значение True.
- Больше. Обозначается знаком >. Если значение слева больше, возвращает True.
- Меньше или равно. Проверяет, является ли левая часть меньше или равной правой. Обозначается знаком (<=).
- Больше или равно (>=). Сравнивает два значения между собой. Если левая часть является большей, чем правая или равной ей, возвращается значение True.
- Равно. Этот оператор отличается от математического знака с тем же значением. Его обозначают, как ==. Если операнды равны между собой, оператор возвращает значение True.
- Не равно. Обозначается, как !=. Выполняет противоположную предыдущему оператору функцию.
Операторы присваивания
Самый частый вариант использования операторов присваивания – указание значения переменной, которая находится слева от этого операнда. Также есть ряд других вариантов использования – сложение и присваивание, вычитание и присваивание, и так далее. Возможны также операции возведения в степень и присваивания, а также деление по модулю и присваивания. Одним словом, результат любой математической операции между левым и правым операндом может быть присвоен левому.
Логические операторы
Необходимы для того, чтобы управлять потоком выполнения программ и проверять условия. В Python есть всего три оператора: and (и), or (или) и not (не).
Операторы принадлежности
Эти операторы проверяют, является ли значение частью последовательности. Последовательность может быть списком, строкой или кортежем. Есть всего два таких оператора: in и not in.
Операторы тождественности
Это более сложные для понимания операторы, которые выполняют проверку операндов на предмет того, занимают ли они одну и ту же ячейку в памяти.
Битовые операторы
Еще один сложный тип операторов, который следует рассматривать отдельно. Он необходим для выполнения операций с битами. Уже требует более профессионального использования.
Более подробно о приоритетности операторов в Python
Каким образом работает приоритетность операторов в Python?
Сначала необходимо начать с рассмотрения определения понятия «Выражение». Под этим словом подразумевается процесс группировки наборов значений, переменных, операторов и вызовов функций. Под исполнением этих выражений подразумевается выполнение их интерпретатором Python.
Давайте приведем простой пример для понимания того, как это работает.
>>> 3 + 4 7
В описанном примере «3+4» это классическое выражение в Python. В него входит два операнда и один оператор. Но инструкции могут быть разными по сложности. Следовательно, и количество операторов в них может отличаться. Для их выполнения необходимо руководствоваться принципом приоритетности. Именно он указывает на то, в каком порядке будут выполняться те или иные операторы.
Приоритеты операторов – примеры
Давайте приведем несколько примеров, в которых продемонстрируем, как объединяются сложные выражения по несколько операторов.
# Сначала выполняется умножение # потом операция сложения # Результат: 17 5 + 4 * 3
Тем не менее, возможно изменение порядка выполнения операторов с помощью скобок. В данном случае они выполняют ту же функцию, что и в стандартных математических выражениях.
# Сначала выполняется умножение # потом операция сложения # Результат: 17 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
Под ассоциативностью подразумевается порядок выполнения выражений, в которых есть несколько одинаково приоритетных операторов. Подавляющее их число (если не учитывать оператор возведения в степень **) поддерживают ассоциативность слева направо.
Примеры ассоциативности
Давайте для того, чтобы было более понятно, приведем пример. Допустим, операторы умножения и деления имеют одинаковую приоритетность. В одном выражении тот, что расположен слева, будет выполняться в первую очередь.
# Тестирование ассоциативности слева направо 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 бывают, и для чего они используются. Также поняли, в какой очередности какие операторы идут для того, чтобы сделать выполнение сложных выражений более простым.
Чтобы понимать особенности работы с операторами интуитивно, необходимо с ними работать, использовать в условных конструкциях и объединять их между собой. Также есть специальные сервисы, называемые «песочницами», которые имеют необходимый функционал для того, чтобы тестировать использование тех или иных операторов в приложениях, а также то, как они относятся друг к другу, и по какой логике работает программа.