V tomto kurzu se dozvíte, jak priorita a asociativita operátorů ovlivňují pořadí operací v Pythonu.
Přednost operátorů Pythonu
Kombinace hodnot, proměnných, operátorů a volání funkcí se označuje jako výraz. Interpret Pythonu může vyhodnotit platný výraz.
Například:
>>> 5 - 7 -2
Zde 5 - 7
je výraz. Ve výrazu může být více než jeden operátor.
K vyhodnocení těchto typů výrazů existuje v Pythonu pravidlo priority. Řídí pořadí, ve kterém jsou tyto operace prováděny.
Například násobení má vyšší prioritu než odčítání.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Toto pořadí však můžeme změnit pomocí závorek, ()
protože má vyšší prioritu než násobení.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Priorita operátorů v Pythonu je uvedena v následující tabulce. Je v sestupném pořadí (horní skupina má vyšší prioritu než nižší).
Operátoři | Význam |
---|---|
() | Závorky |
** | Exponent |
+x ` -x `~x | Unární plus, Unární minus, Bitové NOT |
* ` / ` // ,% | Násobení, dělení, dělení podlahy, modul |
+ , - | Sčítání, odčítání |
<< , >> | Operátory bitového posunu |
& | Bitové AND |
^ | Bitový XOR |
| | Bitové NEBO |
== , != , > , >= , < , <= , is , is not , in ,not in | Srovnání, identita, operátoři členství |
not | Logické NE |
and | Logické AND |
or | Logické NEBO |
Podívejme se na několik příkladů:
Předpokládejme, že budujeme if… else
blok, který běží, if
když je oběd buď ovoce nebo sendvič, a pouze pokud jsou peníze větší nebo rovné 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")
Výstup
Oběd se doručuje
Tento program spouští if
blok, i když jsou peníze 0. Nedává nám požadovaný výstup, protože priorita and
je vyšší než or
.
Požadovaný výstup můžeme získat pomocí závorek ()
následujícím způsobem:
# 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")
Výstup
Nemohu doručit oběd
Asociativita operátorů Pythonu
Ve výše uvedené tabulce vidíme, že ve stejné skupině existuje více než jeden operátor. Tito operátoři mají stejnou přednost.
Když mají dva operátoři stejnou prioritu, asociativita pomáhá určit pořadí operací.
Asociativita je pořadí, ve kterém je vyhodnocován výraz, který má více operátorů stejné priority. Téměř všichni operátoři mají asociativitu zleva doprava.
Například násobení a dělení podlahy mají stejnou přednost. Pokud jsou tedy oba přítomny ve výrazu, vyhodnotí se jako první levý.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Výstup
3 0
Poznámka : Operátor Exponent **
má v Pythonu asociativitu zprava doleva.
# 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)
Vidíme, že 2 ** 3 ** 2
je to ekvivalentní s 2 ** (3 ** 2)
.
Neasociativní operátoři
Některé operátory jako operátory přiřazení a operátory porovnání nemají v Pythonu asociativitu. Pro sekvence tohoto druhu operátorů existují samostatná pravidla a nelze je vyjádřit jako asociativitu.
Například x < y < z
ani neznamená, (x < y) < z
ani x < (y < z)
. x < y < z
je ekvivalentní x < y and y < z
a je vyhodnocován zleva doprava.
Kromě toho, zatímco řetězení přiřazení, jako x = y = z = 1
je naprosto platné, x = y = z+= 2
bude mít za následek chybu.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Výstup
Soubor "", řádek 8 x = y = z + = 2 SyntaxError: neplatná syntaxe