I den här självstudien lär du dig hur operatörers företräde och associativitet påverkar ordningsföljden i Python.
Pythonoperatörernas företräde
Kombinationen av värden, variabler, operatorer och funktionsanrop betecknas som ett uttryck. Python-tolken kan utvärdera ett giltigt uttryck.
Till exempel:
>>> 5 - 7 -2
Här 5 - 7
är ett uttryck. Det kan finnas mer än en operatör i ett uttryck.
För att utvärdera dessa typer av uttryck finns det en regel med företräde i Python. Den styr den ordning i vilken dessa operationer utförs.
Till exempel har multiplikation högre företräde än subtraktion.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Men vi kan ändra denna ordning med parenteser ()
eftersom den har högre företräde än multiplikation.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Operatörens företräde i Python listas i följande tabell. Det är i fallande ordning (övre gruppen har högre företräde än de lägre).
Operatörer | Menande |
---|---|
() | Parentes |
** | Exponent |
+x , -x ,~x | Unary plus, Unary minus, Bitwise INTE |
* , / , // ,% | Multiplikation, division, golvdelning, modul |
+ , - | Addition, subtraktion |
<< , >> | Bitvisa skiftoperatörer |
& | Bitvis OCH |
^ | Bitvis XOR |
| | Bitvis ELLER |
== , != , > , >= , < , <= , is , is not , in ,not in | Jämförelser, identitet, medlemsoperatörer |
not | Logiskt INTE |
and | Logisk OCH |
or | Logiskt ELLER |
Låt oss titta på några exempel:
Anta att vi bygger ett if… else
block som körs if
när lunch är antingen frukt eller smörgås och bara om pengar är mer än eller lika med 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")
Produktion
Lunch levereras
Detta program kör if
block även när pengar är 0. Det ger oss inte den önskade utgången eftersom företräde and
är högre än or
.
Vi kan få önskad effekt genom att använda parentes ()
på följande sätt:
# 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")
Produktion
Kan inte leverera lunch
Associativitet av Python-operatörer
Vi kan se i ovanstående tabell att mer än en operatör finns i samma grupp. Dessa operatörer har samma företräde.
När två operatörer har samma företräde hjälper associeringsförmågan att bestämma arbetsordningen.
Associativitet är den ordning i vilken ett uttryck utvärderas som har flera operatörer med samma prioritet. Nästan alla operatörer har associativitet från vänster till höger.
Till exempel har multiplikation och golvdelning samma företräde. Därför, om båda är närvarande i ett uttryck, utvärderas den vänstra först.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Produktion
3 0
Obs! Exponent-operatören **
har höger-till-vänster-associativitet i 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)
Vi kan se att det 2 ** 3 ** 2
motsvarar 2 ** (3 ** 2)
.
Icke associerande operatörer
Vissa operatörer som tilldelningsoperatörer och jämförelseoperatörer har inte associativitet i Python. Det finns separata regler för sekvenser av denna typ av operatör och kan inte uttryckas som associativitet.
Till exempel x < y < z
varken medel (x < y) < z
eller x < (y < z)
. x < y < z
motsvarar x < y and y < z
och utvärderas från vänster till höger.
Även om kedjning av uppdrag som x = y = z = 1
är helt giltigt, x = y = z+= 2
kommer det dessutom att resultera i fel.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Produktion
Fil "", rad 8 x = y = z + = 2 SyntaxError: ogiltig syntax