Š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 - 7
yra 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… else
bloką, kuris veikia if
tada, 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 if
bloku net tada, kai pinigai yra 0. Ji neduoda mums norimo rezultato, nes pirmenybė and
yra 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 ** 2
tai 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 < z
nei priemonės (x < y) < z
, nei x < (y < z)
. x < y < z
yra lygiavertis x < y and y < z
ir vertinamas iš kairės į dešinę.
Be to, nors grandinės priskyrimai panašūs x = y = z = 1
yra visiškai pagrįsti, x = y = z+= 2
bus 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ė