Prednost in asociativnost operaterjev v Pythonu

V tej vadnici boste izvedeli, kako prednost in združljivost operaterjev vplivata na vrstni red operacij v Pythonu.

Prednost operaterjev Python

Kombinacija vrednosti, spremenljivk, operatorjev in klicev funkcij se imenuje izraz. Tolmač Python lahko oceni veljaven izraz.

Na primer:

 >>> 5 - 7 -2

Tu 5 - 7je izraz. V izrazu je lahko več kot en operator.

Za ocenjevanje teh vrst izrazov v Pythonu obstaja pravilo prednosti. Vodi vrstni red izvajanja teh operacij.

Na primer, množenje ima večjo prednost kot odštevanje.

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

Toda ta vrstni red lahko spremenimo z oklepaji, ()saj ima večjo prednost kot množenje.

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

Prednost operaterja v Pythonu je navedena v naslednji tabeli. Je v padajočem vrstnem redu (zgornja skupina ima večjo prednost kot spodnja).

Operaterji Pomen
() Oklepaji
** Eksponent
+x, -x,~x Unary plus, Unary minus, Bitwise NOT
*, /, //,% Množenje, deljenje, deljenje tal, modul
+, - Seštevanje, odštevanje
<<, >> Operatorji bitnih premikov
& Bitovno AND
^ Bitno XOR
| Bitovno ALI
==, !=, >, >=, <, <=, is, is not, in,not in Primerjave, identiteta, članski operaterji
not Logično NE
and Logično IN
or Logično ALI

Oglejmo si nekaj primerov:

Recimo, da gradimo if… elseblok, ki deluje, ifko je kosilo sadje ali sendvič in le, če je denar večji ali enak 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")

Izhod

 Dostava kosila

Ta program deluje ifblokovno, tudi če je denar 0. Ne daje nam želenega rezultata, saj je prednost andvišja od or.

Želeni izhod lahko dobimo z uporabo oklepajev ()na naslednji 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")

Izhod

 Ne morem dostaviti kosila

Asociativnost operaterjev Python

V zgornji tabeli lahko vidimo, da v isti skupini obstaja več kot en operater. Ti operaterji imajo enako prednost.

Ko imata dva operaterja enako prednost, asociativnost pomaga določiti vrstni red operacij.

Asociativnost je vrstni red ocenjevanja izraza, ki ima več operaterjev iste prednosti. Skoraj vsi operaterji imajo asociacijo od leve proti desni.

Na primer, množenje in deljenje tal imata enako prednost. Če sta v izrazu prisotna oba, se najprej oceni leva.

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

Izhod

 3 0

Opomba : Eksponentni operater **ima v Pythonu asociativnost od desne proti levi.

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

Vidimo, da 2 ** 3 ** 2je to enakovredno 2 ** (3 ** 2).

Neasociativni operaterji

Nekateri operaterji, kot so operatorji dodelitve in operaterji primerjave, v Pythonu nimajo asociativnosti. Za zaporedja te vrste operaterja obstajajo ločena pravila in jih ni mogoče izraziti kot asociativnost.

Na primer, x < y < zniti ne pomeni (x < y) < zniti x < (y < z). x < y < zje enakovredno x < y and y < zin se vrednoti od leve proti desni.

Poleg tega bo veriga nalog, kot x = y = z = 1je popolnoma veljavna, x = y = z+= 2povzročila napake.

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

Izhod

 Datoteka "", vrstica 8 x = y = z + = 2 SyntaxError: neveljavna sintaksa

Zanimive Članki...