Operatoru prioritāte un asociētība Python

Š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 - 7ir 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… elsebloku, kas darbojas, ifja 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 ifblokā pat tad, ja nauda ir 0. Tā nedod mums vēlamo rezultātu, jo prioritāte andir 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 ** 2ir 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 < znedz nozīmē, (x < y) < znedz x < (y < z). x < y < zir ekvivalents x < y and y < zun tiek vērtēts no kreisās uz labo.

Turklāt, lai gan līdzīgu uzdevumu ķēde x = y = z = 1ir pilnīgi derīga, x = y = z+= 2tas 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

Interesanti raksti...