In deze zelfstudie leer je hoe de prioriteit en associativiteit van operators de volgorde van bewerkingen in Python beïnvloeden.
Voorrang van Python-operators
De combinatie van waarden, variabelen, operatoren en functieaanroepen wordt een uitdrukking genoemd. De Python-interpreter kan een geldige uitdrukking evalueren.
Bijvoorbeeld:
>>> 5 - 7 -2
Hier 5 - 7
is een uitdrukking. Een uitdrukking kan meer dan één operator bevatten.
Om dit soort expressies te evalueren, is er een voorrangsregel in Python. Het bepaalt de volgorde waarin deze bewerkingen worden uitgevoerd.
Vermenigvuldiging heeft bijvoorbeeld een hogere prioriteit dan aftrekken.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Maar we kunnen deze volgorde wijzigen met haakjes, ()
omdat deze een hogere prioriteit heeft dan vermenigvuldiging.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
De prioriteit van de operator in Python wordt vermeld in de volgende tabel. Het is in aflopende volgorde (de bovenste groep heeft een hogere prioriteit dan de lagere).
Operatoren | Betekenis |
---|---|
() | Haakjes |
** | Exponent |
+x , -x ,~x | Unair plus, Unair min, Bitsgewijs NIET |
* ` / ` // ,% | Vermenigvuldiging, Divisie, Vloerdeling, Modulus |
+ , - | Optellen, aftrekken |
<< , >> | Bitwise shift-operators |
& | Bitwise EN |
^ | Bitsgewijze XOR |
| | Bitsgewijs OF |
== , != , > , >= , < , <= , is , is not , in ,not in | Vergelijkingen, identiteit, lidmaatschapsoperatoren |
not | Logisch NIET |
and | Logisch EN |
or | Logische OF |
Laten we eens kijken naar enkele voorbeelden:
Stel dat we een if… else
blok bouwen dat loopt if
als de lunch fruit of sandwich is en alleen als het geld meer dan of gelijk is aan 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")
Uitvoer
De lunch wordt bezorgd
Dit programma draait if
block zelfs als het geld 0 is. Het geeft ons niet de gewenste output aangezien de prioriteit and
hoger is dan or
.
We kunnen de gewenste uitvoer krijgen door ()
op de volgende manier haakjes te gebruiken:
# 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")
Uitvoer
Ik kan geen lunch bezorgen
Associativiteit van Python-operators
We kunnen in de bovenstaande tabel zien dat er meer dan één operator in dezelfde groep bestaat. Deze operators hebben dezelfde prioriteit.
Wanneer twee operators dezelfde prioriteit hebben, helpt associativiteit om de volgorde van bewerkingen te bepalen.
Associativiteit is de volgorde waarin een uitdrukking wordt geëvalueerd die meerdere operatoren met dezelfde prioriteit heeft. Bijna alle operators hebben een associativiteit van links naar rechts.
Zo hebben vermenigvuldiging en vloerdeling dezelfde prioriteit. Dus als beide aanwezig zijn in een uitdrukking, wordt de linker eerst geëvalueerd.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Uitvoer
3 0
Opmerking : Exponent-operator **
heeft associativiteit van rechts naar links 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)
We kunnen zien dat het 2 ** 3 ** 2
equivalent is aan 2 ** (3 ** 2)
.
Niet-associatieve operators
Sommige operatoren, zoals toewijzingsoperatoren en vergelijkingsoperatoren, hebben geen associativiteit in Python. Er zijn aparte regels voor reeksen van dit soort operatoren en deze kunnen niet worden uitgedrukt als associativiteit.
Bijvoorbeeld x < y < z
noch betekent (x < y) < z
noch x < (y < z)
. x < y < z
is gelijk aan x < y and y < z
, en wordt geëvalueerd van links naar rechts.
Bovendien, terwijl het aaneenschakelen van opdrachten zoals x = y = z = 1
perfect geldig is, x = y = z+= 2
zal dit resulteren in fouten.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Uitvoer
Bestand "", regel 8 x = y = z + = 2 SyntaxError: ongeldige syntaxis