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 - 7
je 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… else
blok, ktorý beží, if
keď 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 if
blok, aj keď sú peniaze 0. Nedáva nám požadovaný výstup, pretože prednosť pred and
je 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 ** 2
je 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 < z
ani neznamená, (x < y) < z
ani x < (y < z)
. x < y < z
je ekvivalentné x < y and y < z
a hodnotí sa zľava doprava.
Aj keď je reťazenie úloh ako napríklad x = y = z = 1
úplne platné, x = y = z+= 2
bude 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