В този урок ще научите как предимството и асоциативността на операторите влияят върху реда на операциите в 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: невалиден синтаксис