Priorita a asociativita operátorů v Pythonu

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 - 7je 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… elseblok, který běží, ifkdyž 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í ifblok, i když jsou peníze 0. Nedává nám požadovaný výstup, protože priorita andje 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 ** 2je 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 < zani neznamená, (x < y) < zani x < (y < z). x < y < zje ekvivalentní x < y and y < za je vyhodnocován zleva doprava.

Kromě toho, zatímco řetězení přiřazení, jako x = y = z = 1je naprosto platné, x = y = z+= 2bude 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

Zajímavé články...