У цьому підручнику ви дізнаєтеся, як перевага та асоціативність операторів впливають на порядок операцій у 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 | Одинарний плюс, Одинарний мінус, Побітове НЕ |
* , / , // ,% | Множення, Ділення, Ділення підлоги, Модуль |
+ , - | Додавання, віднімання |
<< , >> | Побітові оператори зсуву |
& | Побітове І |
^ | Побітовий XOR |
| | Побітове АБО |
== , != , > , >= , < , <= , 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: помилковий синтаксис