Voorrang en associativiteit van operators in Python

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 - 7is 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… elseblok bouwen dat loopt ifals 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 ifblock zelfs als het geld 0 is. Het geeft ons niet de gewenste output aangezien de prioriteit andhoger 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 ** 2equivalent 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 < znoch betekent (x < y) < znoch x < (y < z). x < y < zis 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 = 1perfect geldig is, x = y = z+= 2zal 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

Interessante artikelen...