Operaattoreiden etusija ja assosiatiivisuus Pythonissa

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 - 7on 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… elselohkon, joka toimii, ifkun 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 iflohkon silloinkin, kun rahat ovat 0. Se ei anna meille haluttua lähtöä, koska etusija andon 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 ** 2se 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 < zei tarkoita (x < y) < zeikä x < (y < z). x < y < zvastaa x < y and y < zja arvioidaan vasemmalta oikealle.

Lisäksi, vaikka kaltaisten tehtävien ketjutus x = y = z = 1on täysin kelvollinen, x = y = z+= 2se 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

Mielenkiintoisia artikkeleita...