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 - 7
izraza. 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… else
blok koji se izvodi if
kad 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 if
blok čak i kad je novac 0. Ne daje nam željeni rezultat jer je prednost and
već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 ** 2
je 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 < z
niti znači (x < y) < z
niti x < (y < z)
. x < y < z
je ekvivalentno x < y and y < z
i ocjenjuje se slijeva udesno.
Nadalje, iako je lanac zadataka kao što x = y = z = 1
je savršeno valjan, x = y = z+= 2
rezultirat ć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