Precedence and Associativity of Operators in Python

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… elseblock som körs ifnä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 ifblock ä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 ** 2motsvarar 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 < zvarken medel (x < y) < zeller x < (y < z). x < y < zmotsvarar x < y and y < zoch 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+= 2kommer 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

Intressanta artiklar...