Prednosť a asociatívnosť operátorov v Pythone

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

Zaujímavé články...