V tomto výučbe sa dozviete, ako priority a asociatívnosť operátorov ovplyvňujú poradie operácií v Pythone.
Prednosť operátorov Pythonu
Kombinácia hodnôt, premenných, operátorov a volaní funkcií sa nazýva výraz. Tlmočník Pythonu dokáže vyhodnotiť platný výraz.
Napríklad:
>>> 5 - 7 -2
Tu 5 - 7je výraz. Vo výraze môže byť viac ako jeden operátor.
Na vyhodnotenie týchto typov výrazov existuje v Pythone pravidlo priority. Usmerňuje poradie, v akom sa tieto operácie vykonávajú.
Napríklad násobenie má vyššiu prednosť ako odčítanie.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Toto poradie však môžeme zmeniť pomocou zátvoriek, ()pretože má vyššiu prednosť ako násobenie.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Prednosť operátora v Pythone je uvedená v nasledujúcej tabuľke. Je v zostupnom poradí (vyššia skupina má vyššiu prednosť ako tie nižšie).
| Operátorov | Význam |
|---|---|
() | Zátvorky |
** | Exponent |
+x, -x,~x | Unárne plus, Unárne mínus, Bitové NOT |
*, /, //,% | Násobenie, delenie, podlahové delenie, modul |
+, - | Sčítanie, odčítanie |
<<, >> | Operátory bitového posunu |
& | Bitové AND |
^ | Bitový XOR |
| | Bitové ALEBO |
==, !=, >, >=, <, <=, is, is not, in,not in | Porovnania, totožnosť, operátori členstva |
not | Logické NIE |
and | Logické AND |
or | Logické ALEBO |
Pozrime sa na niekoľko príkladov:
Predpokladajme, že budujeme if… elseblok, ktorý beží, ifkeď je obed buď ovocie alebo sendvič, a iba ak sú peniaze väčšie alebo 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ýkon
Obed sa podáva
Tento program spúšťa ifblok, aj keď sú peniaze 0. Nedáva nám požadovaný výstup, pretože prednosť pred andje vyššia ako or.
Požadovaný výstup môžeme získať použitím zátvoriek ()nasledujúcim spôsobom:
# 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ýkon
Nemôžem doniesť obed
Asociatívnosť operátorov Pythonu
Vo vyššie uvedenej tabuľke vidíme, že v tej istej skupine existuje viac ako jeden operátor. Títo operátori majú rovnakú prednosť.
Keď majú dvaja operátori rovnakú prednosť, asociativita pomáha určiť poradie operácií.
Asociativita je poradie, v ktorom sa vyhodnocuje výraz, ktorý má viac operátorov rovnakej priority. Takmer všetci operátori majú asociativitu zľava doprava.
Napríklad násobenie a podlahové delenie majú rovnakú prednosť. Ak sú teda obidve vo výraze, vyhodnotí sa najskôr ľavý.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Výkon
3 0
Poznámka : Operátor Exponent **má v Pythone asociativitu sprava doľava.
# 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 rovnocenné s 2 ** (3 ** 2).
Neasociatívni operátori
Niektorí operátori ako operátory priradenia a operátory porovnania nemajú v Pythone asociativitu. Pre sekvencie tohto druhu operátorov existujú samostatné pravidlá a nemôžu byť vyjadrené ako asociatívnosť.
Napríklad x < y < zani neznamená, (x < y) < zani x < (y < z). x < y < zje ekvivalentné x < y and y < za hodnotí sa zľava doprava.
Aj keď je reťazenie úloh ako napríklad x = y = z = 1úplne platné, x = y = z+= 2bude mať za následok chybu.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Výkon
Súbor „“, riadok 8 x = y = z + = 2 SyntaxError: neplatná syntax








