Î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 - 7
o 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… else
bloc care rulează if
atunci 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ă if
bloc chiar și atunci când banii sunt 0. Nu ne oferă rezultatul dorit, deoarece precedența lui and
este 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 ** 2
este 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 < z
nici nu înseamnă (x < y) < z
nici x < (y < z)
. x < y < z
este 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 = 1
este perfect validă, x = y = z+= 2
va 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ă