Loginės operacijos vaidina svarbų vaidmenį programuojant. Jie naudojami sąlyginėms konstrukcijoms kurti ir sudėtingiems algoritmams sudaryti. Python sistemoje loginės operacijos atliekamos naudojant loginius operatorius:
-
not
– loginis neigimas -
and
– loginis junginys -
or
– loginis disjunkcija
Šiame straipsnyje kalbėsime apie neakivaizdžias detales ir paslėptas loginių operatorių veikimo Python ypatybes.
Tiesos lentelės loginiams operatoriams
Esame įpratę, kad programavimo kalbose grįžta loginiai operatoriai True
arba False
vertybes pagal jų tiesos lenteles.
Tiesos lentelė not
Operatorius:
a |
not a |
---|---|
Netiesa | Tiesa |
Tiesa | Netiesa |
Tiesos lentelė and
Operatorius:
a |
b |
a and b |
---|---|---|
Netiesa | Netiesa | Netiesa |
Netiesa | Tiesa | Netiesa |
Tiesa | Netiesa | Netiesa |
Tiesa | Tiesa | Tiesa |
Tiesos lentelė or
Operatorius:
a |
b |
a or b |
---|---|---|
Netiesa | Netiesa | Netiesa |
Netiesa | Tiesa | Tiesa |
Tiesa | Netiesa | Tiesa |
Tiesa | Tiesa | Tiesa |
Kai loginių operatorių operandai yra True
ir False
Python loginių operatorių elgesys taip pat atitinka šias tiesos lenteles.
print(not True)
print(not False)
print(False and True)
print(True and True)
print(False or True)
print(False or False)
Šis kodas išveda:
False
True
False
True
True
False
Tačiau Python neapsiriboja vien tik True
ir False
kaip operandai loginiams operatoriams. Operandai not
, and
ir or
operatoriai gali būti bet kokių kitų duomenų tipų objektai.
Tiesos ir klaidingos sąvokos
Viena iš svarbių Python ypatybių yra teisingų ir klaidingų objektų samprata. Bet koks Python objektas gali būti įvertintas kaip True
arba False
. Objektai, kurie vertina True
yra vadinami tiesa objektais, o objektai, kurie vertina False
vadinami klaidingais objektais.
Įmontuoti netikri objektai apima:
- Vertė
False
- Vertė
None
- Skaitiniai nuliai:
0
,0.0
,0j
,Decimal(0)
,Fraction(0, 1)
- Tuščios sekos ir kolekcijos:
''
,()
,()
,{}
,set()
,range(0)
Kiti integruotų duomenų tipų objektai yra tikroviški objektai. Pasirinktinių klasių egzemplioriai pagal numatytuosius nustatymus taip pat yra teisingi objektai.
Norėdami konvertuoti objektus į True
arba False
įmontuotas bool()
funkcija naudojama.
# Falsy objects
print(bool(False))
print(bool(None))
print(bool(0))
print(bool(0.0))
print(bool(()))
print(bool(''))
print(bool({}))
# Truthy objects
print(bool(True))
print(bool(123))
print(bool(69.96))
print(bool('beegeek'))
print(bool((4, 8, 15, 16, 23, 42)))
print(bool({1, 2, 3}))
Šis kodas išveda:
False
False
False
False
False
False
False
True
True
True
True
True
True
„Python“ teisingų ir klaidingų objektų samprata leidžia dirbti su sąlyginiais operatoriais paprasčiau.
Pavyzdžiui, šis kodas:
if len(data) > 0:
...
if value == True:
...
if value == False:
...
galima perrašyti taip:
if data:
...
if value:
...
if not value:
...
The not
operatorius
Kaip žinome, operandas not
operatorius gali būti bet kokio tipo objektas. Jei operandas skiriasi nuo True
ir False
, jis vertinamas pagal teisingų ir klaidingų objektų sampratą. Rezultatas iš not
operatorius visada True
arba False
.
print(not False)
print(not None)
print(not 0)
print(not 0.0)
print(not ())
print(not '')
print(not {})
Šis kodas išveda:
True
True
True
True
True
True
True
print(not True)
print(not 123)
print(not 69.96)
print(not 'beegeek')
print(not (4, 8, 15, 16, 23, 42))
print(not {1, 2, 3})
Šis kodas išveda:
False
False
False
False
False
False
The and
ir or
Operatoriai
Operandai and
ir or
operatoriai, tokie kaip not
operatorius, gali būti bet kokio tipo duomenų objektai. Analogiškai su not
operatorius, galite manyti, kad rezultatas and
ir or
operatoriai taip pat True
arba False
. Tačiau šie operatoriai grąžina vieną iš savo operandų. Kuris iš jų priklauso nuo paties operatoriaus.
print(None or 0)
print(0 or 5)
print('beegeek' or None)
print((1, 2, 3) or (6, 9))
print(1 or 'beegeek' or None)
print(0.0 or 'habr' or {'one': 1})
print(0 or '' or (6, 9))
print(0 or '' or ())
print(0 or '' or () or {})
Šis kodas išveda:
0
5
beegeek
(1, 2, 3)
1
habr
(6, 9)
()
{}
Kaip matome, or
operatorius kiekvieną operandą įvertina kaip teisingą arba klaidingą objektą, bet negrįžta True
arba False
bet pirmasis teisingas objektas arba paskutinis objektas, jei loginėje išraiškoje teisingų objektų nerasta.
Panašiai, and
operatorius elgiasi taip pat.
print(None and 10)
print(5 and 0.0)
print('beegeek' and {})
print((1, 2, 3) and (6, 9))
print(1 and 'beegeek' and None)
print('habr' and 0 and {'one': 1})
print(10 and (6, 9) and ())
Šis kodas išveda:
None
0.0
{}
(6, 9)
None
0
()
The and
operatorius grąžina pirmąjį klaidingą objektą arba paskutinį objektą, jei loginėje išraiškoje nerasta klaidingų objektų.
Loginiai operatoriai yra tingūs
Python loginiai operatoriai yra tingūs. Tai reiškia, kad grąžintas operandas nustatomas įvertinus visų operandų teisingumą iš kairės į dešinę, kol jis tampa nereikšmingas:
- Jei kairysis operandas
or
operatorius yra tikras objektas, bendras loginės išraiškos rezultatas yraTrue
nepaisant tinkamo operando. - Jei kairysis operandas
and
operatorius yra klaidingas objektas, bendras loginės išraiškos rezultatas yraFalse
nepaisant tinkamo operando.
Šis mechanizmas vadinamas trumpojo jungimo įvertinimu ir jį naudoja interpretatorius skaičiavimams optimizuoti. Apsvarstykite šį pavyzdį, kuris parodo tokį elgesį.
def f():
print('bee')
return 3
if True or f():
print('geek')
Šis kodas išveda:
geek
Kairysis operandas or
operatorius yra tikras objektas (True
), todėl nereikia vertinti tinkamo operando, o tai reiškia, kad reikia skambinti f()
funkcija. Kadangi funkcija nėra iškviečiama, išvestis neapima eilutės bee
. Bendras loginės išraiškos rezultatas yra True
todėl sąlygos sąlyginiame bloke yra vykdomos instrukcijos, ir mes matome eilutę geek
išėjime.
Priešingai, šis kodas:
def f():
print('bee')
return 3
if True and f():
print('geek')
Šis kodas išveda:
bee
geek
Kairysis operandas and
operatorius yra tikras objektas (True
), todėl reikia įvertinti tinkamą operandą, o tai reiškia, kad reikia iškviesti f()
funkcija. Dėl to funkcijos instrukcijos yra vykdomos ir mes matome eilutę bee
išėjime. Funkcija grąžina skaičių 3
, kuris taip pat yra tikras objektas. Todėl bendras loginės išraiškos rezultatas yra 3
ir sąlygos sąlyginio bloko instrukcijos yra vykdomos, ir mes matome eilutę geek
išėjime.
Loginių operatorių prioritetas
Svarbu atsiminti loginių operatorių prioritetą. Žemiau pateikiami loginiai operatoriai mažėjančia prioriteto tvarka (iš viršaus į apačią):
Pagal loginių operatorių prioritetą, šis kodas:
a = 0
b = 7
c = 10
print(not a and b or not c) # 7
yra lygiavertis:
a = 0
b = 7
c = 10
print(((not a) and b) or (not c)) # 7
Palyginti su kitais Python operatoriais (
pavyzdžiui, aritmetiniai operatoriai), loginiai operatoriai turi mažiausią prioritetą. Jei norite pakeisti operatorių prioritetą, naudokite skliaustus.
Pavyzdžiui, šis kodas:
a = 1
b = 2
c = 3
d = 4
print(a + b and c + d) # 7
yra lygiavertis:
a = 1
b = 2
c = 3
d = 4
print((a + b) and (c + d)) # 7
Bet toks kodas:
a = 1
b = 2
c = 3
d = 4
print(a + (b and c) + d) # 5
yra lygiavertis:
a = 1
b = 2
c = 3
d = 4
print(a + (b and c) + d) # 5
Loginių operatorių ypatumai
Jei loginių operatorių operandai yra sudėtingi objektai, rezultatas gali būti netikėtas. Pažiūrėkime į pavyzdį:
d1 = {'a': 1}
d2 = {'b': 2}
result = d1 or d2
print(result) # {'a': 1}
result('a') += 10
print(d1) # {'a': 11}
Kaip matome, or
operatorius grąžina pirmąjį tikrąjį objektą (d1
) ir priskiria jį result
kintamasis. Jei tada pakeisime reikšmę raktu 'a'
viduje result
žodynas, žodynas d1
taip pat pasikeis, nes abu kintamieji nurodo tą patį objektą.
Jei pavyzdį perrašysime glausčiau, paaiškės, kodėl taip nutinka:
d1 = {'a': 1}
d2 = {'b': 2}
d = d1 if d1 else d2
d('a') += 10
print(d1) # {'a': 11}
Panašiai elgesys and
operatorius gali parodyti:
d1 = {'a': 1}
d2 = {'b': 2}
result = d1 and d2
print(result) # {'b': 2}
result('b') += 10
print(d2) # {'b': 12}
The and
operatorius grąžina antrąjį objektą, jei pirmasis yra tikras objektas. Jei reikšmė pagal raktą 'b'
tada pakeičiamas result
žodynas, d2
žodynas taip pat pasikeis, nes abu kintamieji nurodo tą patį objektą.
Trumpesne forma:
d1 = {'a': 1}
d2 = {'b': 2}
d = d2 if d1 else d1
d('b') += 10
print(d2) # {'b': 12}
Santrauka
Python programoje loginiai operatoriai naudojami sąlyginėms konstrukcijoms kurti ir sudėtingiems algoritmams sudaryti. Tačiau jie taip pat turi neakivaizdžių detalių ir paslėptų funkcijų:
- Rezultatas iš
not
operatorius visadaTrue
arbaFalse
bet rezultatasand
iror
operatoriai gali būti bet koks objektas. - The
not
operatorius apverčia operando teisingumą, oand
operatorius grąžina pirmąjį klaidingą objektą arba paskutinį objektą, oor
operatorius grąžina pirmą tikrą objektą arba paskutinį objektą. - Python loginiai operatoriai yra tingūs, tai reiškia, kad jie vertina operandus tik tol, kol tampa akivaizdus bendras loginės išraiškos rezultatas.
- Loginiai operatoriai turi tam tikrą prioritetą vienas kito ir kitų Python operatorių atžvilgiu.
- Loginių operatorių elgesys gali būti netikėtas, kai jų operandai yra sudėtingi objektai, nes operatoriai grąžina nuorodas į objektus, o ne jų kopijas.
Python loginių operatorių ypatumų supratimas leidžia parašyti efektyvesnį ir efektyvesnį kodą.
Jei tekste radote klaidą, siųskite pranešimą autoriui pažymėdami klaidą ir paspausdami Ctrl-Enter.