Selles õpetuses saate teada, kuidas operaatorite tähtsus ja assotsiatiivsus mõjutavad Pythonis toimingute järjekorda.
Pythoni operaatorite ülimuslikkus
Väärtuste, muutujate, operaatorite ja funktsioonikutsete kombinatsiooni nimetatakse väljendiks. Pythoni tõlk saab hinnata kehtivat avaldist.
Näiteks:
>>> 5 - 7 -2
Siin 5 - 7
on väljend. Avaldises võib olla mitu operaatorit.
Seda tüüpi avaldiste hindamiseks on Pythonis ülimuslik reegel. See juhendab nende toimingute teostamise järjekorda.
Näiteks korrutamisel on suurem prioriteet kui lahutamisel.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Kuid me saame seda järjekorda muuta sulgude abil, ()
kuna sellel on suurem prioriteet kui korrutamisel.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Operaatori prioriteet Pythonis on loetletud järgmises tabelis. See on kahanevas järjekorras (ülemine rühm on kõrgemal kui alumine).
Operaatorid | Tähendus |
---|---|
() | Sulgudes |
** | Eksponent |
+x , -x ,~x | Unary pluss, Unary miinus, Bitwise EI |
* , / , // ,% | Korrutamine, jagamine, korrusjaotus, moodul |
+ , - | Liitmine, lahutamine |
<< , >> | Pikkade vahetustega operaatorid |
& | Pikkade kaupa JA |
^ | Piki XOR |
| | Piki VÕI |
== , != , > , >= , < , <= , is , is not , in ,not in | Võrdlused, identiteet, liikmesuse operaatorid |
not | Loogiline EI |
and | Loogiline JA |
or | Loogiline VÕI |
Vaatame mõningaid näiteid:
Oletame, et me ehitame if… else
ploki, mis töötab if
siis, kui lõunasöök on kas puuvilja või võileib, ja ainult siis, kui raha on suurem kui 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")
Väljund
Lõunasöök toimetatakse
See programm töötab if
blokeeringuga isegi siis, kui raha on 0. See ei anna meile soovitud väljundit, kuna prioriteet and
on suurem kui or
.
Soovitud väljundi saame sulgude ()
abil järgmisel viisil:
# 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")
Väljund
Lõunasööki ei saa kätte
Pythoni operaatorite assotsiatiivsus
Ülaltoodud tabelist näeme, et samas rühmas on rohkem kui üks operaator. Nendel operaatoritel on sama ülimuslikkus.
Kui kahel operaatoril on sama ülimuslikkus, aitab assotsiatiivsus määrata toimingute järjekorra.
Assotsiatiivsus on avaldise hindamise järjekord, millel on mitu sama prioriteediga operaatorit. Peaaegu kõigil operaatoritel on vasakult paremale assotsiatiivsus.
Näiteks korrutamisel ja põranda jagamisel on sama ülimuslikkus. Seega, kui mõlemad on avaldises olemas, hinnatakse kõigepealt vasakpoolset.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Väljund
3 0
Märkus . Eksponentoperaatoril **
on Pythonis paremalt vasakule assotsiatiivsus.
# 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)
Näeme, et see 2 ** 3 ** 2
on samaväärne 2 ** (3 ** 2)
.
Mittesotsiatiivsed operaatorid
Mõned operaatorid, nagu määranguoperaatorid, ja võrdlusoperaatorid ei oma Pythonis assotsiatsiooni. Sellist tüüpi operaatorite järjestuste jaoks on eraldi reeglid ja neid ei saa väljendada assotsiatiivsusena.
Näiteks x < y < z
ei tähenda (x < y) < z
ega tähenda x < (y < z)
. x < y < z
on samaväärne x < y and y < z
ja seda hinnatakse vasakult paremale.
Pealegi, kuigi sarnaste ülesannete aheldamine x = y = z = 1
on täiesti kehtiv, x = y = z+= 2
toob see kaasa vea.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Väljund
Fail "", rida 8 x = y = z + = 2 SyntaxError: kehtetu süntaks