Prednost i asocijativnost operatora u Pythonu

U ovom vodiču naučit ćete kako prednost i asocijativnost operatora utječu na redoslijed operacija u Pythonu.

Prednost Python operatora

Kombinacija vrijednosti, varijabli, operatora i poziva funkcije naziva se izrazom. Protumač Python može procijeniti valjani izraz.

Na primjer:

 >>> 5 - 7 -2

Evo 5 - 7izraza. U izrazu može biti više operatora.

Da bi se procijenile ove vrste izraza, u Pythonu postoji pravilo prednosti. Vodi redoslijedom kojim se provode ove operacije.

Na primjer, množenje ima veći prioritet od oduzimanja.

 # Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2

Ali ovaj redoslijed možemo promijeniti pomoću zagrada ()jer ima veći prioritet od množenja.

 # Parentheses () has higher precedence >>> (10 - 4) * 2 12

Prednost operatora u Pythonu navedena je u sljedećoj tablici. U silaznom je redoslijedu (gornja skupina ima veći prioritet od donjih).

Operateri Značenje
() Zagrade
** Eksponent
+x, -x,~x Unary plus, Unary minus, Bitwise NOT
*, /, //,% Množenje, dijeljenje, dijeljenje poda, modul
+, - Zbrajanje, oduzimanje
<<, >> Operatori bitnog pomaka
& Bitno I
^ Bitno XOR
| Bitno ILI
==, !=, >, >=, <, <=, is, is not, in,not in Usporedbe, identitet, operateri članstva
not Logično NE
and Logično I
or Logično ILI

Pogledajmo nekoliko primjera:

Pretpostavimo da gradimo if… elseblok koji se izvodi ifkad je ručak voće ili sendvič i samo ako je novac veći ili jednak 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")

Izlaz

 Dostava ručka

Ovaj program pokreće ifblok čak i kad je novac 0. Ne daje nam željeni rezultat jer je prednost andveća od or.

Željeni izlaz možemo dobiti pomoću zagrade ()na sljedeći način:

 # 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")

Izlaz

 Ne mogu dostaviti ručak

Asocijativnost Python operatora

U gornjoj tablici možemo vidjeti da u istoj grupi postoji više operatora. Ti operatori imaju isti prioritet.

Kada dva operatora imaju isti prioritet, asocijativnost pomaže odrediti redoslijed operacija.

Asocijativnost je redoslijed ocjenjivanja izraza koji ima više operatora istog prioriteta. Gotovo svi operateri imaju asocijaciju slijeva nadesno.

Primjerice, množenje i dijeljenje poda imaju isti prioritet. Stoga, ako su obojica prisutna u izrazu, prvo se ocjenjuje lijevi.

 # Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))

Izlaz

 3 0

Napomena : Operator eksponenta **ima asocijativnost zdesna nalijevo u Pythonu.

 # 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)

Možemo vidjeti da 2 ** 3 ** 2je to ekvivalentno 2 ** (3 ** 2).

Neasocijativni operatori

Neki operatori poput operatora dodjele i operatora usporedbe nemaju asocijativnost u Pythonu. Postoje zasebna pravila za sekvence ove vrste operatora i ne mogu se izraziti kao asocijativnost.

Na primjer, x < y < zniti znači (x < y) < zniti x < (y < z). x < y < zje ekvivalentno x < y and y < zi ocjenjuje se slijeva udesno.

Nadalje, iako je lanac zadataka kao što x = y = z = 1je savršeno valjan, x = y = z+= 2rezultirat će pogreškom.

 # Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2

Izlaz

 Datoteka "", redak 8 x = y = z + = 2 SyntaxError: nevaljana sintaksa

Zanimljivi članci...