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 FalsePython 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, andir 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 Falsebet 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 yra Truenepaisant tinkamo operando.
  • Jei kairysis operandas and operatorius yra klaidingas objektas, bendras loginės išraiškos rezultatas yra Falsenepaisant 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 Truetodė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 3ir 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 visada True arba Falsebet rezultatas and ir or operatoriai gali būti bet koks objektas.
  • The not operatorius apverčia operando teisingumą, o and operatorius grąžina pirmąjį klaidingą objektą arba paskutinį objektą, o or 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.



Source link

By admin

Draugai: - Marketingo paslaugos - Teisinės konsultacijos - Skaidrių skenavimas - Fotofilmų kūrimas - Karščiausios naujienos - Ultragarsinis tyrimas - Saulius Narbutas - Įvaizdžio kūrimas - Veidoskaita - Nuotekų valymo įrenginiai -  Padelio treniruotės - Pranešimai spaudai -