Precedenza e associatività degli operatori in Python

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 - 7un'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… elseblocco che funziona ifquando 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 ifblocco 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 < zné significa (x < y) < zx < (y < z). x < y < zè equivalente a x < y and y < ze viene valutato da sinistra a destra.

Inoltre, mentre il concatenamento di assegnazioni come x = y = z = 1è perfettamente valido, x = y = z+= 2risulterà 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

Articoli interessanti...