Cum se utilizează operatorul ternar Python

Acest ghid îți va arăta cum să folosești operatorul ternar în Python. Vei descoperi sintaxa și vei analiza diverse exemple pentru a înțelege modul său de funcționare.

Vom începe prin a recapitula cum funcționează instrucțiunea condițională if-else, apoi vom învăța cum să creăm o expresie echivalentă folosind operatorul ternar.

Ulterior, vom examina câteva exemple practice și vom afla cum să simulăm comportamentul operatorului ternar specific Python folosind un tuplu și un dicționar Python. În cele din urmă, vom explora câteva situații în care ar trebui să preferi utilizarea operatorului ternar.

Să începem!

Instrucțiunea If-Else în Python: O Revedere

Poți scrie cod pornind de la un REPL Python sau folosind un editor online Python, cum ar fi cel de pe tipstrick.ro.

Sintaxa de bază a instrucțiunii if-else în Python este următoarea:

if condition:
    # execută acest cod
else:
    # execută acest cod

În fragmentul de mai sus, „condition” reprezintă criteriul care trebuie evaluat. Dacă rezultatul evaluării „condition” este True, atunci se execută codul din blocul „if”. Dacă rezultatul evaluării este False, atunci se execută instrucțiunile din blocul „else”.

Iată un exemplu în care variabilei `game_over` i se atribuie o valoare booleană în funcție de nivelul de energie.

  • Dacă energia <= 0, atunci `game_over` va fi `True`.
  • Altfel, `game_over` va fi `False`.

Următorul fragment de cod ilustrează cum se poate face acest lucru folosind instrucțiunile condiționale if-else:

energy = -1

if energy <= 0:
    game_over = True
else:
    game_over = False

print(game_over)
# True

În acest caz, `energy` este -1, care este mai mic decât 0. Așadar, valoarea `game_over` devine `True`.

Operatorul Ternar Python: Sintaxă și Ilustrații

Python dispune de un operator ternar, care funcționează similar cu operatorul condițional ternar din limbaje precum C și C++. Sintaxa generală este:

expression1 if condition else expression2

Să analizăm această sintaxă:

  • `condition`: condiția care trebuie verificată.
  • `expression1`: expresia care se evaluează dacă `condition` este adevărată.
  • `expression2`: expresia care se evaluează dacă `condition` este falsă.

Acum, vom identifica ce ar trebui să fie `expression1`, `expression2` și `condition` în versiunea cu `if-else` a codului.

Punând totul împreună, folosind operatorul ternar din Python, avem următorul cod:

game_over = True if energy <= 0 else False
print(game_over)
# True

Să scriem un alt exemplu. Să presupunem că deții o librărie și oferi clienților o reducere, în funcție de cât de des au vizitat magazinul în ultimul an.

Fie `numVisits` numărul de vizite.

  • Dacă `numVisits` > 7, atunci procentul de reducere, `discount_perc` este 20.
  • Altfel, `discount_perc` este 5.

Vom folosi operatorul ternar pentru a atribui valoarea variabilei `discount_perc`.

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 20 (deoarece numVisits = 10, care este > 7)

În continuare, vom învăța cum să emulăm operatorul ternar folosind un tuplu și un dicționar Python.

Emularea Operatorului Ternar cu un Tuplu Python

Similar cu toate tipurile iterabile din Python, tuplurile urmează o indexare de la zero. Astfel, dacă un tuplu are două elemente, `tuple_name[0]` va reprezenta primul element, iar `tuple_name[1]` va da al doilea element.

Tipuri de date de bază în Python sunt întregi, numere cu virgulă mobilă, șiruri și valori booleene. Python suportă conversii de tip, care permit reprezentarea unei anumite date într-un alt tip de date echivalent.

Deschide un REPL Python și rulează următoarele exemple. Dacă încerci să transformi numere întregi în booleene, vei observa următoarele:

  • `bool(0)` este `False`.
  • `bool()` returnează `True`.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

Similar, atunci când transformăm valori booleene în întregi, obținem:

>>> int(True)
1
>>> int(False)
0

Combinând conversia de tip și indexarea, putem proceda după cum urmează:

  • Elementul de la indexul 0 din tuplu: valoarea folosită când condiția este falsă.
  • Elementul de la indexul 1 din tuplu: valoarea folosită când condiția este adevărată.

Aplicând cele de mai sus, avem următorul cod:

>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20

Aici, condiția `numVisits > 7` este adevărată, deoarece `numVisits` este 10. Deoarece `int(True)` este 1, valoarea `discount_perc` este 20, elementul de la indexul 1.

Emularea Operatorului Ternar cu un Dicționar Python

Poți folosi `True` și `False` drept chei într-un dicționar. Apoi, poți seta `expression1` și `expression2` ca valori asociate cheilor `True` și `False`, respectiv.

some_dict = {True: expression1,
             False: expression2
            }

Ce urmează? Acum, dacă folosești `some_dict[condition]`, se va evalua `expression1` (corespunzătoare cheii `True`) dacă `condition` este `True`. Iar `expression2` se va evalua dacă `condition` este `False`.

Să scriem din nou exemplul `discount_perc`, dar folosind un dicționar Python de această dată.

>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20

În acest caz, `numVisits = 10`, care este mai mare decât 7. Prin urmare, condiția `numVisits > 7` este adevărată. Astfel, `discount_dict[numVisits > 7]` se evaluează la `discount_dict[True]`, care are valoarea 20.

Ar Trebui Să Folosești Întotdeauna Operatorul Ternar Python?

Până acum, am învățat cum să folosim operatorul ternar. Dar ar trebui să îl folosim mereu? Ei bine, operatorul ternar ar putea să nu fie ideal în toate cazurile. Această secțiune explorează situațiile în care ar trebui să preferi folosirea operatorului ternar în detrimentul instrucțiunilor `if-else`. Vom discuta și situațiile în care ar trebui să iei în considerare utilizarea instrucțiunii `if-else` în locul operatorului ternar.

Mai Concis Decât Blocurile If-Else

După cum s-a menționat, în Python, operatorul ternar este mai concis decât instrucțiunea `if-else`. De aceea, îl poți folosi pentru a verifica condiții și a evalua expresii în mod condiționat.

În următorul exemplu, `nums` este o listă cu 10 numere întregi generate aleatoriu. Pentru fiecare dintre aceste numere, verificăm dacă este par sau impar. Și această evaluare are loc în cadrul unui string formatat.

import random

nums = [random.choice(range(100)) for i in range(10)]

for num in nums:
    print(f"{num} este {'par' if num%2==0 else 'impar'}")
# exemplu de output

0 este par
56 este par
6 este par
53 este impar
62 este par
7 este impar
8 este par
77 este impar
41 este impar
94 este par

Operatorul Ternar Necesită Clauza Else

Când folosești instrucțiunile condiționale `if-else`, clauza `else` este opțională. Să luăm un exemplu. Variabila `game_over` este setată la `True` dacă energia scade la o valoare mai mică sau egală cu zero.

Totuși, dacă energia este mai mare decât zero, variabila `game_over` nu este niciodată inițializată. Astfel, vei întâmpina erori dacă încerci să accesezi variabila `game_over`.

energy = 5
if energy <= 0:
    game_over = True

print(f"S-a terminat jocul? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"S-a terminat jocul? {game_over}")
NameError: name 'game_over' is not defined

O modalitate de a rezolva această problemă este să setezi inițial `game_over` la `False` și să o actualizezi la `True` doar dacă nivelul de energie este mai mic sau egal cu zero.

energy = 5
game_over = False
if energy <= 0:
    game_over1 = True

print(f"S-a terminat jocul? {game_over}")

Totuși, când folosești operatorul ternar Python echivalent, clauza `else` nu este opțională. Operatorul ternar necesită ca expresia să fie evaluată și când condiția este falsă.

game_over = True if energy <= 0 else False

Dacă modifici codul de mai sus la `game_over = True if energy <= 0`, eliminând partea `else`, vei întâmpina o eroare de sintaxă, după cum se vede:

File "ternary_op.py", line 42
    game_over = True if energy <= 0
                                  ^
SyntaxError: invalid syntax

Pentru a Verifica Multiple Condiții, Folosește Instrucțiuni If-Else

Să analizăm următorul exemplu: Fiecare întrebare dintr-un set de întrebări pentru un interviu de programare are un scor de dificultate asociat. În funcție de acest scor, atribuim întrebării unul dintre cele trei niveluri de dificultate: ușor, mediu sau greu. Să presupunem următoarele:

Scor Nivel de dificultate
Mai puțin de 10 ușor
Între 10 și 20 mediu
Mai mare de 20 greu

Având în vedere scorul de dificultate, poți obține nivelul de dificultate folosind operatorul ternar Python, după cum se vede:

score = 12

difficulty_level = "usor" if score < 10 else "greu" if score > 20 else "mediu"

print(difficulty_level)
# mediu

Expresia operatorului ternar din codul de mai sus are următoarea formă:

expression1 if condition1 else expression2 if condition2 else expression3

Deși este concis, este destul de dificil de citit și de analizat. Următoarea imagine ilustrează cum se desfășoară fluxul de control în acest caz.

Următorul fragment de cod ilustrează o implementare echivalentă folosind instrucțiuni `if-else`. După cum se observă, fluxul de control este mult mai ușor de înțeles, iar codul este mai lizibil.

if score < 10:
    difficulty_level="usor"
elif score > 20:
    difficulty_level="greu"
else:
    difficulty_level="mediu"

print(difficulty_level)

Așadar, când ai multiple condiții, ar trebui să folosești blocurile `if-else` în locul operatorului ternar. Acest lucru asigură că codul este mai ușor de citit și de înțeles.

De asemenea, când trebuie să execuți multiple instrucțiuni – în funcție de dacă o condiție este adevărată sau falsă – ar trebui să iei în considerare folosirea instrucțiunii `if-else`.

Concluzie

Iată o recapitulare a ceea ce ai învățat în acest tutorial.

  • În Python, operatorul ternar poate fi folosit cu următoarea sintaxă: `expresie1 if condiție else expresie2`.
  • Poți simula comportamentul operatorului ternar folosind tupluri și dicționare Python.
  • Deși operatorul ternar poate fi o alternativă mai concisă la blocurile `if-else`, trebuie să te asiguri că codul rămâne lizibil. Pentru a îmbunătăți lizibilitatea, poți folosi instrucțiunile `if-else` în locul operatorului ternar, mai ales când trebuie să înlănțuiești mai multe condiții.

În continuare, studiază tutorialul despre operatorii de egalitate și inegalitate în Python.