Tässä opetusohjelmassa opit, kuinka operaattoreiden etusija ja assosiatiivisuus vaikuttavat Pythonin toimintojen järjestykseen.
Python-operaattoreiden etusija
Arvojen, muuttujien, operaattoreiden ja funktiokutsujen yhdistelmää kutsutaan lausekkeeksi. Python-tulkki voi arvioida kelvollisen lausekkeen.
Esimerkiksi:
>>> 5 - 7 -2
Tässä 5 - 7
on lauseke. Lausekkeessa voi olla useampi kuin yksi operaattori.
Tämän tyyppisten lausekkeiden arvioimiseksi Pythonissa on etusijasääntö. Se ohjaa näiden toimintojen järjestystä.
Esimerkiksi kertolasku on tärkeämpi kuin vähennyslasku.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Mutta voimme muuttaa tätä järjestystä sulkeilla, ()
koska sillä on korkeampi etusija kuin kertolaskulla.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Operaattorin etusija Pythonissa on lueteltu seuraavassa taulukossa. Se on laskevassa järjestyksessä (ylemmällä ryhmällä on korkeampi etusija kuin alemmilla).
Operaattorit | Tarkoitus |
---|---|
() | Sulkeet |
** | Eksponentti |
+x , -x ,~x | Unary plus, Unary miinus, Bitwise EI |
* , / , // ,% | Kertolasku, jako, kerrosjako, moduuli |
+ , - | Lisäys, vähennyslasku |
<< , >> | Bittisuuntaiset operaattorit |
& | Bittikohtaisesti JA |
^ | Bitteittäin XOR |
| | Bittiä TAI |
== , != , > , >= , < , <= , is , is not , in ,not in | Vertailut, henkilöllisyys, jäsenoperaattorit |
not | Looginen EI |
and | Looginen JA |
or | Looginen TAI |
Katsotaanpa joitain esimerkkejä:
Oletetaan, että rakennamme if… else
lohkon, joka toimii, if
kun lounas on joko hedelmää tai voileipää, ja vain, jos rahaa on enemmän tai yhtä suuri kuin 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")
Tuotos
Lounas toimitetaan
Tämä ohjelma suorittaa if
lohkon silloinkin, kun rahat ovat 0. Se ei anna meille haluttua lähtöä, koska etusija and
on suurempi kuin or
.
Voimme saada halutun tuloksen käyttämällä sulkeita ()
seuraavalla tavalla:
# 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")
Tuotos
Ei voi toimittaa lounasta
Python-operaattoreiden assosiatiivisuus
Yllä olevasta taulukosta voidaan nähdä, että samassa ryhmässä on useampi kuin yksi operaattori. Näillä operaattoreilla on sama etusija.
Kun kahdella operaattorilla on sama etusija, assosiatiivisuus auttaa määrittämään toimintojen järjestyksen.
Assosiatiivisuus on lausekkeen arviointijärjestys, jolla on useita saman prioriteetin operaattoreita. Lähes kaikilla operaattoreilla on assosiatiivisuus vasemmalta oikealle.
Esimerkiksi kertolaskulla ja kerroksen jakamisella on sama etusija. Jos molemmat ovat läsnä lausekkeessa, vasen arvioidaan ensin.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Tuotos
3 0
Huomautus : Eksponenttioperaattorilla **
on oikealta vasemmalle -yhdistämistoiminto Pythonissa.
# 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)
Voimme nähdä, että 2 ** 3 ** 2
se vastaa 2 ** (3 ** 2)
.
Muut kuin assosiatiiviset operaattorit
Jotkut operaattorit, kuten määritysoperaattorit ja vertailuoperaattorit, eivät ole assosiatiivisia Pythonissa. Tämän tyyppisille operaattoreille on erilliset säännöt, eikä niitä voida ilmaista assosiatiivisuutena.
Esimerkiksi, x < y < z
ei tarkoita (x < y) < z
eikä x < (y < z)
. x < y < z
vastaa x < y and y < z
ja arvioidaan vasemmalta oikealle.
Lisäksi, vaikka kaltaisten tehtävien ketjutus x = y = z = 1
on täysin kelvollinen, x = y = z+= 2
se johtaa virheisiin.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Tuotos
Tiedosto "", rivi 8 x = y = z + = 2 SyntaxError: virheellinen syntakse