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

В этом руководстве вы узнаете, как приоритет и ассоциативность операторов влияют на порядок операций в Python.

Приоритет операторов Python

Комбинация значений, переменных, операторов и вызовов функций называется выражением. Интерпретатор Python может вычислить допустимое выражение.

Например:

 >>> 5 - 7 -2

Вот 5 - 7выражение. В выражении может быть более одного оператора.

Для оценки этих типов выражений в Python существует правило приоритета. Он определяет порядок, в котором выполняются эти операции.

Например, умножение имеет более высокий приоритет, чем вычитание.

 # Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2

Но мы можем изменить этот порядок, используя круглые скобки, ()поскольку он имеет более высокий приоритет, чем умножение.

 # Parentheses () has higher precedence >>> (10 - 4) * 2 12

Приоритет операторов в Python указан в следующей таблице. Он находится в порядке убывания (верхняя группа имеет более высокий приоритет, чем нижняя).

Операторы Смысл
() Скобки
** Экспонента
+x, -x,~x Унарный плюс, Унарный минус, Побитовое НЕ
*, /, //,% Умножение, деление, деление этажа, модуль
+, - Сложение, вычитание
<<, >> Операторы побитового сдвига
& Побитовое И
^ Побитовое исключающее ИЛИ
| Побитовое ИЛИ
==, !=, >, >=, <, <=, is, is not, in,not in Операторы сравнения, идентичности, членства
not Логическое НЕ
and Логическое И
or Логическое ИЛИ

Давайте посмотрим на несколько примеров:

Предположим, мы создаем if… elseблок, который запускается, ifкогда обед состоит из фруктов или бутербродов, и только если денег больше или равно 2.

 # Precedence of or & and meal = "fruit" money = 0 if meal == "fruit" or meal == "sandwich" and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")

Вывод

 Обед доставляется

Эта программа запускает ifблок, даже когда деньги равны 0. Это не дает нам желаемого результата, поскольку приоритет andвыше, чем or.

Мы можем получить желаемый результат, используя круглые скобки ()следующим образом:

 # Precedence of or & and meal = "fruit" money = 0 if (meal == "fruit" or meal == "sandwich") and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")

Вывод

 Не могу доставить обед

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

Из приведенной выше таблицы видно, что в одной группе существует более одного оператора. У этих операторов одинаковый приоритет.

Когда два оператора имеют одинаковый приоритет, ассоциативность помогает определить порядок операций.

Ассоциативность - это порядок, в котором вычисляется выражение, имеющее несколько операторов с одинаковым приоритетом. Практически все операторы обладают ассоциативностью слева направо.

Например, умножение и деление по полу имеют одинаковый приоритет. Следовательно, если оба они присутствуют в выражении, сначала оценивается левое.

 # Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))

Вывод

 3 0

Примечание . Оператор экспоненты **имеет ассоциативность справа налево в Python.

 # Shows the right-left associativity of ** # Output: 512, Since 2**(3**2) = 2**9 print(2 ** 3 ** 2) # If 2 needs to be exponated fisrt, need to use () # Output: 64 print((2 ** 3) ** 2)

Мы видим, что 2 ** 3 ** 2это эквивалентно 2 ** (3 ** 2).

Неассоциативные операторы

Некоторые операторы, такие как операторы присваивания и операторы сравнения, не имеют ассоциативности в Python. Для последовательностей такого рода операторов существуют отдельные правила, которые не могут быть выражены как ассоциативность.

Например, x < y < zни значит, (x < y) < zни x < (y < z). x < y < zэквивалентен x < y and y < zи оценивается слева направо.

Кроме того, хотя цепочка назначений вроде x = y = z = 1совершенно допустима, x = y = z+= 2это приведет к ошибке.

 # Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2

Вывод

 Файл "", строка 8 x = y = z + = 2 SyntaxError: недопустимый синтаксис

Интересные статьи...