В этом руководстве вы узнаете, как приоритет и ассоциативность операторов влияют на порядок операций в 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: недопустимый синтаксис