I denne opplæringen lærer du hvordan forrang og tilknytning til operatører påvirker rekkefølgen for operasjoner i Python.
Forrang for Python-operatører
Kombinasjonen av verdier, variabler, operatører og funksjonskall kalles et uttrykk. Python-tolken kan evaluere et gyldig uttrykk.
For eksempel:
>>> 5 - 7 -2
Her 5 - 7
er et uttrykk. Det kan være mer enn én operator i et uttrykk.
For å evaluere disse typer uttrykk er det en forrangsregel i Python. Den styrer rekkefølgen disse operasjonene utføres i.
For eksempel har multiplikasjon høyere forrang enn subtraksjon.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Men vi kan endre denne rekkefølgen ved hjelp av parenteser, ()
da den har høyere prioritet enn multiplikasjon.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Operatørprioriteten i Python er oppført i følgende tabell. Det er i fallende rekkefølge (øvre gruppe har høyere forrang enn de nedre).
Operatører | Betydning |
---|---|
() | Parenteser |
** | Eksponent |
+x , -x ,~x | Unary pluss, Unary minus, Bitvis IKKE |
* , / , // ,% | Multiplikasjon, divisjon, gulvdivisjon, modul |
+ , - | Tillegg, subtraksjon |
<< , >> | Bitvis skiftoperatører |
& | Bitvis OG |
^ | Bitvis XOR |
| | Bitvis ELLER |
== , != , > , >= , < , <= , is , is not , in ,not in | Sammenligning, identitet, medlemsoperatører |
not | Logisk IKKE |
and | Logisk OG |
or | Logisk ELLER |
La oss se på noen eksempler:
Anta at vi konstruerer en if… else
blokk som løper if
når lunsj enten er frukt eller sandwich, og bare hvis pengene er mer enn eller lik 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")
Produksjon
Lunsj blir levert
Dette programmet kjører if
blokkere selv når penger er 0. Det gir oss ikke ønsket utgang siden forrang av and
er høyere enn or
.
Vi kan få ønsket produksjon ved å bruke parentes ()
på følgende måte:
# 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")
Produksjon
Kan ikke levere lunsj
Associativitet av Python-operatører
Vi kan se i tabellen ovenfor at det finnes flere operatører i samme gruppe. Disse operatørene har samme forrang.
Når to operatører har samme forrang, hjelper assosiativitet til å bestemme rekkefølgen på operasjonene.
Assosiativitet er den rekkefølgen et uttrykk blir evaluert som har flere operatorer av samme forrang. Nesten alle operatørene har assosiativitet fra venstre til høyre.
For eksempel har multiplikasjon og gulvdeling samme forrang. Derfor, hvis begge er til stede i et uttrykk, blir den venstre evaluert først.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Produksjon
3 0
Merk : Eksponentoperatør **
har assosiativitet fra høyre til 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 tilsvarer 2 ** (3 ** 2)
.
Ikke tilknyttede operatører
Noen operatører som oppdragsoperatører og sammenligningsoperatører har ikke tilknytning i Python. Det er separate regler for sekvenser av denne typen operatører og kan ikke uttrykkes som assosiativitet.
For eksempel x < y < z
betyr verken (x < y) < z
eller x < (y < z)
. x < y < z
tilsvarer x < y and y < z
, og blir evaluert fra venstre til høyre.
Videre, mens kjetting av oppgaver som x = y = z = 1
er helt gyldig, x = y = z+= 2
vil det føre til feil.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Produksjon
Fil "", linje 8 x = y = z + = 2 SyntaxError: ugyldig syntaks