Šajā apmācībā jūs uzzināsiet, kā operatoru prioritāte un asociativitāte ietekmē darbību secību Python.
Python operatoru prioritāte
Vērtību, mainīgo, operatoru un funkciju izsaukumu kombinācija tiek saukta par izteiksmi. Python tulks var novērtēt derīgu izteicienu.
Piemēram:
>>> 5 - 7 -2
Šeit 5 - 7
ir izteiciens. Izteiksmē var būt vairāki operatori.
Lai novērtētu šāda veida izteicienus, Python ir noteikts priekšroka noteikums. Tas nosaka secību, kādā šīs operācijas tiek veiktas.
Piemēram, reizināšanai ir augstāka prioritāte nekā atņemšanai.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Bet mēs varam mainīt šo kārtību, izmantojot iekavas, ()
jo tai ir augstāka prioritāte nekā reizināšanai.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Operatora prioritāte Python ir norādīta šajā tabulā. Tas ir dilstošā secībā (augšējai grupai ir augstāka prioritāte nekā apakšējām).
Operatori | Nozīme |
---|---|
() | Iekavas |
** | Eksponents |
+x , -x ,~x | Unary plus, Unary mīnus, Bitwise NAV |
* , / , // ,% | Reizināšana, dalīšana, grīdas dalīšana, modulis |
+ , - | Saskaitīšana, atņemšana |
<< , >> | Bitu kustības operatori |
& | Bitu virzienā UN |
^ | Bitor XOR |
| | Bitwise OR |
== , != , > , >= , < , <= , is , is not , in ,not in | Salīdzinājumi, identitāte, dalības operatori |
not | Loģiski NAV |
and | Loģiski UN |
or | Loģiski VAI |
Apskatīsim dažus piemērus:
Pieņemsim, ka mēs būvējam if… else
bloku, kas darbojas, if
ja pusdienas ir vai nu augļi, vai sviestmaize, un tikai tad, ja nauda ir lielāka vai vienāda ar 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")
Rezultāts
Pusdienas tiek piegādātas
Šī programma darbojas if
blokā pat tad, ja nauda ir 0. Tā nedod mums vēlamo rezultātu, jo prioritāte and
ir augstāka par or
.
Mēs varam iegūt vēlamo rezultātu, izmantojot iekavas ()
šādā veidā:
# 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")
Rezultāts
Nevar piegādāt pusdienas
Python operatoru asociativitāte
Iepriekš redzamajā tabulā redzam, ka vienā grupā ir vairāki operatori. Šiem operatoriem ir vienāda prioritāte.
Ja diviem operatoriem ir vienāda prioritāte, asociativitāte palīdz noteikt darbību secību.
Asociativitāte ir izteiksmes novērtēšanas secība, kurai ir vairāki vienas prioritātes operatori. Gandrīz visiem operatoriem ir asociācija no kreisās uz labo.
Piemēram, reizināšanai un grīdas dalīšanai ir vienāda prioritāte. Tādējādi, ja izteiksmē ir abi, vispirms tiek novērtēts kreisais.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Rezultāts
3 0
Piezīme : Eksponenta operatoram **
Python ir asociativitāte no labās uz kreiso.
# 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)
Mēs varam redzēt, ka tas 2 ** 3 ** 2
ir līdzvērtīgs 2 ** (3 ** 2)
.
Nesaistīti operatori
Dažiem operatoriem, piemēram, piešķiršanas operatoriem un salīdzināšanas operatoriem, Python nav asociativitātes. Šāda veida operatoru sekvencēm ir atsevišķi noteikumi, un tos nevar izteikt kā asociativitāti.
Piemēram, x < y < z
nedz nozīmē, (x < y) < z
nedz x < (y < z)
. x < y < z
ir ekvivalents x < y and y < z
un tiek vērtēts no kreisās uz labo.
Turklāt, lai gan līdzīgu uzdevumu ķēde x = y = z = 1
ir pilnīgi derīga, x = y = z+= 2
tas radīs kļūdas.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Rezultāts
Fails "", 8. rinda x = y = z + = 2 SyntaxError: nederīga sintakse