Предимство и асоциативност на операторите в 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 Единствен плюс, Единствен минус, Побитово НЕ
*, /, //,% Умножение, деление, деление на пода, модул
+, - Събиране, изваждане
<<, >> Побитови оператори на смяна
& Побитово И
^ Побитово 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: невалиден синтаксис

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