I denne vejledning lærer du, hvordan operatørers forrang og associativitet påvirker rækkefølgen af operationer i Python.
Python-operatørers forrang
Kombinationen af værdier, variabler, operatorer og funktionsopkald betegnes som et udtryk. Python-tolken kan evaluere et gyldigt udtryk.
For eksempel:
>>> 5 - 7 -2
Her 5 - 7
er et udtryk. Der kan være mere end én operator i et udtryk.
For at evaluere disse typer udtryk er der en forrangsregel i Python. Den styrer rækkefølgen, i hvilken disse operationer udføres.
For eksempel har multiplikation højere forrang end subtraktion.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Men vi kan ændre denne rækkefølge ved hjælp af parenteser, ()
da den har højere forrang end multiplikation.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Operatørprioriteten i Python er angivet i følgende tabel. Det er i faldende rækkefølge (øvre gruppe har højere forrang end de nederste).
Operatører | Betyder |
---|---|
() | Parenteser |
** | Eksponent |
+x , -x ,~x | Unary plus, Unary minus, Bitwise IKKE |
* , / , // ,% | Multiplikation, division, gulvdeling, modul |
+ , - | Addition, subtraktion |
<< , >> | Bitvis skiftoperatører |
& | Bitvis OG |
^ | Bitvis XOR |
| | Bitvis ELLER |
== , != , > , >= , < , <= , is , is not , in ,not in | Sammenligninger, identitet, medlemsoperatører |
not | Logisk IKKE |
and | Logisk OG |
or | Logisk ELLER |
Lad os se på nogle eksempler:
Antag, at vi konstruerer en if… else
blok, der kører, if
når frokosten enten er frugt eller sandwich, og kun hvis penge er mere end eller lig 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
Frokost bliver leveret
Dette program kører if
blok, selv når penge er 0. Det giver os ikke det ønskede output, da forrang for and
er højere end or
.
Vi kan få det ønskede output ved at bruge parentes ()
på følgende måde:
# 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 ikke levere frokost
Associativitet af Python-operatører
Vi kan se i ovenstående tabel, at der findes mere end en operator i samme gruppe. Disse operatører har samme forrang.
Når to operatører har samme forrang, hjælper associativitet med at bestemme rækkefølgen af operationer.
Associativitet er den rækkefølge, hvor et udtryk evalueres, der har flere operatorer af samme forrang. Næsten alle operatørerne har associativitet fra venstre mod højre.
For eksempel har multiplikation og gulvdeling samme forrang. Derfor, hvis begge er til stede i et udtryk, evalueres den venstre først.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Produktion
3 0
Bemærk : Eksponentoperatøren **
har associativitet fra højre mod venstre 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, at 2 ** 3 ** 2
det svarer til 2 ** (3 ** 2)
.
Ikke-associerede operatører
Nogle operatører som opgaveoperatører og sammenligningsoperatører har ikke associativitet i Python. Der er separate regler for sekvenser af denne type operator og kan ikke udtrykkes som associativitet.
For eksempel x < y < z
betyder hverken (x < y) < z
eller x < (y < z)
. x < y < z
svarer til x < y and y < z
og evalueres fra venstre mod højre.
Selvom sammenkædning af opgaver ligesom x = y = z = 1
er perfekt gyldig, x = y = z+= 2
vil det desuden resultere i fejl.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Produktion
Fil "", linje 8 x = y = z + = 2 SyntaxError: ugyldig syntaks