In questo tutorial imparerai come la precedenza e l'associatività degli operatori influenzano l'ordine delle operazioni in Python.
Precedenza degli operatori Python
La combinazione di valori, variabili, operatori e chiamate di funzione viene definita espressione. L'interprete Python può valutare un'espressione valida.
Per esempio:
>>> 5 - 7 -2
Ecco 5 - 7
un'espressione. Può esserci più di un operatore in un'espressione.
Per valutare questi tipi di espressioni esiste una regola di precedenza in Python. Guida l'ordine in cui queste operazioni vengono eseguite.
Ad esempio, la moltiplicazione ha una precedenza maggiore della sottrazione.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Ma possiamo cambiare questo ordine usando le parentesi ()
poiché ha una precedenza maggiore della moltiplicazione.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
La precedenza degli operatori in Python è elencata nella tabella seguente. È in ordine decrescente (il gruppo superiore ha la precedenza maggiore rispetto a quelli inferiori).
Operatori | Senso |
---|---|
() | Parentesi |
** | Esponente |
+x , -x ,~x | Più unario, Meno unario, NON bit per bit |
* , / , // ,% | Moltiplicazione, divisione, divisione del pavimento, modulo |
+ , - | Addizione, sottrazione |
<< , >> | Operatori di spostamento bit per bit |
& | Bitwise AND |
^ | Bitwise XOR |
| | OR bit per bit |
== , != , > , >= , < , <= , is , is not , in ,not in | Operatori di confronti, identità, appartenenza |
not | NOT logico |
and | AND logico |
or | OR logico |
Vediamo alcuni esempi:
Supponiamo di costruire un if… else
blocco che funziona if
quando il pranzo è frutta o panino e solo se il denaro è maggiore o uguale a 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")
Produzione
Pranzo in consegna
Questo programma esegue il if
blocco anche quando money è 0. Non ci fornisce l'output desiderato poiché la precedenza di and
è maggiore di or
.
Possiamo ottenere l'output desiderato usando le parentesi ()
nel modo seguente:
# 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")
Produzione
Non posso consegnare il pranzo
Associatività degli operatori Python
Possiamo vedere nella tabella sopra che più di un operatore esiste nello stesso gruppo. Questi operatori hanno la stessa precedenza.
Quando due operatori hanno la stessa precedenza, l'associatività aiuta a determinare l'ordine delle operazioni.
L'associatività è l'ordine in cui viene valutata un'espressione che ha più operatori con la stessa precedenza. Quasi tutti gli operatori hanno associatività da sinistra a destra.
Ad esempio, la moltiplicazione e la divisione dei piani hanno la stessa precedenza. Quindi, se entrambi sono presenti in un'espressione, viene valutata per prima quella di sinistra.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Produzione
3 0
Nota : l'operatore esponente **
ha associatività da destra a sinistra in 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)
Possiamo vedere che 2 ** 3 ** 2
è equivalente a 2 ** (3 ** 2)
.
Operatori non associativi
Alcuni operatori come gli operatori di assegnazione e gli operatori di confronto non hanno l'associatività in Python. Esistono regole separate per sequenze di questo tipo di operatore e non possono essere espresse come associatività.
Ad esempio, x < y < z
né significa (x < y) < z
né x < (y < z)
. x < y < z
è equivalente a x < y and y < z
e viene valutato da sinistra a destra.
Inoltre, mentre il concatenamento di assegnazioni come x = y = z = 1
è perfettamente valido, x = y = z+= 2
risulterà in errore.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Produzione
File "", riga 8 x = y = z + = 2 SyntaxError: sintassi non valida