Operatorių pirmenybė ir asociatyvumas „Python“

Šioje pamokoje sužinosite, kaip operatorių pirmenybė ir asociatyvumas veikia „Python“ operacijų tvarką.

„Python“ operatorių pirmenybė

Reikšmių, kintamųjų, operatorių ir funkcijų iškvietimų derinys vadinamas išraiška. „Python“ vertėjas gali įvertinti galiojančią išraišką.

Pavyzdžiui:

 >>> 5 - 7 -2

Čia 5 - 7yra išraiška. Išraiškoje gali būti daugiau nei vienas operatorius.

Norint įvertinti tokio tipo išraiškas, „Python“ yra teikiama pirmenybės taisyklė. Ji nurodo šių operacijų atlikimo tvarką.

Pavyzdžiui, daugyba turi didesnę pirmenybę nei atimtis.

 # Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2

Bet mes galime pakeisti šią tvarką naudodami skliaustus, ()nes ji turi didesnę pirmenybę nei daugyba.

 # Parentheses () has higher precedence >>> (10 - 4) * 2 12

Operatoriaus pirmenybė „Python“ yra išvardyta šioje lentelėje. Jis yra mažėjančia tvarka (viršutinė grupė turi didesnę pirmenybę nei apatinė).

Operatoriai Reikšmė
() Skliaustai
** Eksponentas
+x, -x,~x „Unary“ pliusas, „Unary“ minusas, „Bitwise“ NE
*, /, //,% Daugyba, dalyba, grindų dalyba, modulis
+, - Sudėjimas, atimtis
<<, >> Bitų keitimo operatoriai
& Bitais IR
^ Bitais XOR
| ARBA bitais
==, !=, >, >=, <, <=, is, is not, in,not in Palyginimai, tapatybė, narystės operatoriai
not Logiška NE
and Loginis IR
or Logiška ARBA

Pažvelkime į keletą pavyzdžių:

Tarkime, kad mes kuriame if… elsebloką, kuris veikia iftada, kai pietūs yra vaisiai arba sumuštinis, ir tik tuo atveju, jei pinigai yra didesni arba lygūs 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")

Rezultatas

 Pristatomi pietūs

Ši programa veikia ifbloku net tada, kai pinigai yra 0. Ji neduoda mums norimo rezultato, nes pirmenybė andyra didesnė už or.

Norimą išvestį galime gauti naudodami skliaustus ()tokiu būdu:

 # 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")

Rezultatas

 Negaliu pristatyti pietų

„Python“ operatorių asociatyvumas

Aukščiau pateiktoje lentelėje matome, kad toje pačioje grupėje yra daugiau nei vienas operatorius. Šie operatoriai turi tą patį prioritetą.

Kai du operatoriai turi vienodą pirmenybę, asociatyvumas padeda nustatyti operacijų tvarką.

Asociatyvumas yra tvarka, kuria vertinama išraiška, turinti kelis tos pačios pirmumo operatorius. Beveik visi operatoriai turi asociaciją iš kairės į dešinę.

Pavyzdžiui, dauginimas ir grindų dalijimas turi tą patį prioritetą. Taigi, jei abu yra išraiškoje, pirmiausia įvertinama kairė.

 # Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))

Rezultatas

 3 0

Pastaba : „Exponent“ operatorius **turi „Python“ asociaciją iš dešinės į kairę.

 # 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)

Matome, kad 2 ** 3 ** 2tai prilygsta 2 ** (3 ** 2).

Asociatyvūs operatoriai

Kai kurie operatoriai, pavyzdžiui, priskyrimo ir palyginimo operatoriai, neturi „Python“ asociatyvumo. Tokio tipo operatoriaus sekoms yra atskiros taisyklės ir jų negalima išreikšti asociatyvumu.

Pavyzdžiui, x < y < znei priemonės (x < y) < z, nei x < (y < z). x < y < zyra lygiavertis x < y and y < zir vertinamas iš kairės į dešinę.

Be to, nors grandinės priskyrimai panašūs x = y = z = 1yra visiškai pagrįsti, x = y = z+= 2bus padaryta klaida.

 # Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2

Rezultatas

 Failas "", 8 eilutė x = y = z + = 2 SyntaxError: neteisinga sintaksė

Įdomios straipsniai...