Precedența și asociativitatea operatorilor din Python

În acest tutorial, veți afla cum precedența și asociativitatea operatorilor afectează ordinea operațiilor în Python.

Precedența operatorilor Python

Combinația de valori, variabile, operatori și apeluri de funcții este denumită expresie. Interpretul Python poate evalua o expresie validă.

De exemplu:

 >>> 5 - 7 -2

Iată 5 - 7o expresie. Într-o expresie poate fi mai mult de un operator.

Pentru a evalua aceste tipuri de expresii există o regulă de prioritate în Python. Ghidează ordinea în care sunt efectuate aceste operațiuni.

De exemplu, multiplicarea are o prioritate mai mare decât scăderea.

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

Dar putem schimba această ordine folosind paranteze (), deoarece are o prioritate mai mare decât înmulțirea.

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

Prioritatea operatorului în Python este listată în tabelul următor. Este în ordine descrescătoare (grupul superior are prioritate mai mare decât cele inferioare).

Operatori Sens
() Paranteze
** Exponent
+x, -x,~x Unary plus, Unary minus, Bitwise NOT
*, /, //,% Înmulțirea, divizarea, divizarea etajului, modulul
+, - Adunare, scădere
<<, >> Operatori de schimbare bitwise
& Bitwise ȘI
^ Bitwise XOR
| OR bit
==, !=, >, >=, <, <=, is, is not, in,not in Comparații, identitate, operatori de membru
not Logic NU
and Logic ȘI
or OR logic

Să vedem câteva exemple:

Să presupunem că construim un if… elsebloc care rulează ifatunci când masa de prânz este fie fructe, fie sandviș și numai dacă banii sunt mai mari sau egali cu 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")

Ieșire

 Prânzul fiind livrat

Acest program rulează ifbloc chiar și atunci când banii sunt 0. Nu ne oferă rezultatul dorit, deoarece precedența lui andeste mai mare decât or.

Putem obține rezultatul dorit folosind paranteze ()în modul următor:

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

Ieșire

 Nu pot livra prânzul

Asociativitatea operatorilor Python

Putem vedea în tabelul de mai sus că există mai mulți operatori în același grup. Acești operatori au aceeași prioritate.

Când doi operatori au aceeași prioritate, asociativitatea ajută la determinarea ordinii operațiilor.

Asociativitatea este ordinea în care este evaluată o expresie care are mai mulți operatori cu aceeași prioritate. Aproape toți operatorii au asociativitate de la stânga la dreapta.

De exemplu, înmulțirea și împărțirea etajului au aceeași prioritate. Prin urmare, dacă ambele sunt prezente într-o expresie, cea stângă este evaluată mai întâi.

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

Ieșire

 3 0

Notă : Operatorul de componente **are asociativitate de la dreapta la stânga în Python.

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

Putem vedea că 2 ** 3 ** 2este echivalent cu 2 ** (3 ** 2).

Operatori neasociativi

Unii operatori precum operatorii de atribuire și operatorii de comparație nu au asociativitate în Python. Există reguli separate pentru secvențe de acest tip de operator și nu pot fi exprimate ca asociativitate.

De exemplu, x < y < znici nu înseamnă (x < y) < znici x < (y < z). x < y < zeste echivalent cu x < y and y < zși este evaluat de la stânga la dreapta.

Mai mult, deși înlănțuirea sarcinilor ca x = y = z = 1este perfect validă, x = y = z+= 2va rezulta o eroare.

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

Ieșire

 Fișier "", linia 8 x = y = z + = 2 SintaxăError: sintaxă nevalidă

Articole interesante...