Ebben az oktatóanyagban megtudhatja, hogy az operátorok elsőbbsége és asszociativitása hogyan befolyásolja a műveletek sorrendjét a Pythonban.
A Python operátorok elsőbbsége
Az értékek, változók, operátorok és függvényhívások kombinációját kifejezésnek nevezzük. A Python tolmács ki tudja értékelni az érvényes kifejezést.
Például:
>>> 5 - 7 -2
Itt 5 - 7
van egy kifejezés. Egy kifejezésben több operátor is lehet.
Az ilyen típusú kifejezések kiértékeléséhez egy elsőbbségi szabály érvényes a Pythonban. Ez irányítja e műveletek végrehajtásának sorrendjét.
Például a szorzásnak nagyobb az elsőbbsége, mint a kivonásnak.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
De ezt a sorrendet zárójelek segítségével módosíthatjuk ()
, mivel nagyobb az elsőbbsége, mint a szorzás.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
A Python operátor elsőbbségét a következő táblázat sorolja fel. Csökkenő sorrendben van (a felső csoport elsőbbséget élvez, mint az alsó csoport).
Operátorok | Jelentése |
---|---|
() | Zárójelek |
** | Kitevő |
+x , -x ,~x | Unary plus, Unary mínusz, Bitwise NOT |
* , / , // ,% | Szorzás, osztás, emelet osztás, modulus |
+ , - | Összeadás, kivonás |
<< , >> | Bitenkénti váltás operátorok |
& | Bitenkénti ÉS |
^ | Bitenként XOR |
| | Bitenként VAGY |
== , != , > , >= , < , <= , is , is not , in ,not in | Összehasonlítások, identitás, tagsági operátorok |
not | Logikus NEM |
and | Logikai ÉS |
or | Logikai VAGY |
Nézzünk meg néhány példát:
Tegyük fel, hogy építünk egy if… else
blokkot, amely akkor fut, if
amikor az ebéd gyümölcs vagy szendvics, és csak akkor, ha a pénz nagyobb, mint 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")
Kimenet
Ebédet szállítanak
Ez a program akkor is futtatja a if
blokkot, ha a pénz 0. Nem adja meg a kívánt kimenetet, mivel a fontossági sorrend and
magasabb, mint or
.
A kívánt kimenetet a zárójelek használatával ()
a következő módon kaphatjuk meg :
# 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")
Kimenet
Nem tudok ebédet leadni
A Python operátorok asszociativitása
A fenti táblázatból láthatjuk, hogy egynél több operátor létezik ugyanabban a csoportban. Ezeknek az operátoroknak ugyanaz az elsőbbségük.
Ha két operátornak ugyanaz az elsőbbsége, az asszociativitás segít meghatározni a műveletek sorrendjét.
Az asszociativitás az a sorrend, amelyben egy olyan kifejezést értékelünk, amelynek több operátora azonos prioritású. Szinte az összes operátor balról jobbra asszociatív.
Például a szorzásnak és a padlófelosztásnak ugyanaz az elsőbbsége. Ezért, ha mindkettő jelen van egy kifejezésben, akkor először a bal oldalt értékelik.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Kimenet
3 0
Megjegyzés : Az Exponent operátor **
jobbról balra asszociativitással rendelkezik a Pythonban.
# 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)
Láthatjuk, hogy 2 ** 3 ** 2
ez egyenértékű 2 ** (3 ** 2)
.
Nem asszociatív operátorok
Egyes operátorok, például a hozzárendelési operátorok és az összehasonlító operátorok, nem rendelkeznek asszociativitással a Pythonban. Az ilyen típusú operátorok szekvenciáira külön szabályok vonatkoznak, és nem fejezhetők ki asszociativitásként.
Például x < y < z
sem (x < y) < z
nem , sem nem x < (y < z)
. x < y < z
ekvivalens x < y and y < z
, és balról jobbra értékelik.
Továbbá, bár a hasonló hozzárendelések láncolása x = y = z = 1
tökéletesen érvényes, x = y = z+= 2
hibát fog eredményezni.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Kimenet
"" Fájl, 8. sor x = y = z + = 2 SyntaxError: érvénytelen szintaxis