Како користити Питхон тернарни оператор

Ovaj vodič će vas uputiti kako da iskoristite ternarni operator u programskom jeziku Python. Učićete o njegovoj sintaksi i analizirati konkretne primere radi boljeg razumevanja njegove funkcionalnosti.

Najpre ćemo se osvrnuti na to kako funkcioniše uslovni iskaz `if-else`, a zatim ćemo naučiti kako se može napisati ekvivalentan izraz koristeći ternarni operator.

Nakon toga, razmotrićemo nekoliko primera kodiranja i kako da simuliramo ponašanje Python-ovog ternarnog operatora koristeći tuple i rečnike u Pythonu. Konačno, razmotrićemo određene slučajeve upotrebe gde je preporučljivo koristiti ternarni operator.

Započnimo!

Pregled `if-else` iskaza u Python-u

Kodiranje možete praktikovati pokretanjem Python REPL okruženja ili koristeći online Python editor.

Opšta sintaksa `if-else` iskaza u Python-u je sledeća:

if uslov:
    # izvrši ovo
else:
    # izvrši ovo

U navedenom segmentu, `uslov` predstavlja kriterijum koji se testira. Ukoliko se `uslov` proceni kao `Tačno` (True), izvršava se `if` blok. Ukoliko se `uslov` proceni kao `Netačno` (False), izvršavaju se iskazi unutar `else` bloka.

Sledi primer gde se promenljivoj `game_over` dodeljuje Booleova vrednost u zavisnosti od toga da li je vrednost `energije` manja ili jednaka nuli.

  • Ako je `energija` <= 0, `game_over` je `Tačno`.
  • U suprotnom, `game_over` je `Netačno`.

Sledeći isečak koda pokazuje kako se to može implementirati koristeći uslovne `if-else` iskaze:

energy = -1

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

print(game_over)
# True

U ovom konkretnom slučaju, `energija` je postavljena na -1, što je manje od 0. Shodno tome, `game_over` se postavlja na `Tačno`.

Python ternarni operator: Sintaksa i primeri

Python poseduje ternarni operator, koji deluje poput ternarnog uslovnog operatora u jezicima poput C i C++. Njegova opšta sintaksa je sledeća:

izraz1 if uslov else izraz2

Detaljno ćemo analizirati gornju sintaksu:

  • `uslov`: Kriterijum koji se proverava.
  • `izraz1`: Izraz koji se procenjuje ako je `uslov` `Tačan`.
  • `izraz2`: Izraz koji se procenjuje ako je `uslov` `Netačan`.

Sada ćemo identifikovati koji bi bili `izraz1`, `izraz2` i `uslov` u odnosu na `if-else` verziju koda.

Kombinujući sve navedeno, imamo sledeće rešenje koristeći Python-ov ternarni operator:

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

Razmotrimo još jedan primer. Recimo da imate knjižaru i dajete popust kupcima na osnovu toga koliko često su posećivali vašu prodavnicu tokom protekle godine.

Neka `numVisits` označava broj poseta.

  • Ako je `numVisits` > 7, procenat popusta, `discount_perc` je 20.
  • U suprotnom, `discount_perc` je 5.

Koristimo ternarni operator da dodelimo vrednost promenljivoj `discount_perc`.

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 20 (jer je numVisits = 10 što je > 7)

U nastavku ćemo naučiti kako da simuliramo ternarni operator koristeći Python tuple i rečnike.

Simulacija ternarnog operatora pomoću Python tuple-a

Kao i svi iterabili u Pythonu, tuple koriste indeksiranje počevši od nule. Dakle, ako imate dva elementa u tuple-u, `tuple_name[0]` označava prvi element u tuple-u, a `tuple_name[1]` drugi element u tuple-u.

Osnovni tipovi podataka u Pythonu su ceo broj, float, string i Booleov tip. Python podržava konverziju tipova, što omogućava da se određeni tip podataka predstavi njegovim ekvivalentom u drugom tipu podataka.

Pokrenite Python REPL okruženje i izvršite sledeće primere. Ako pokušate da konvertujete cele brojeve u Booleove, primetićete sledeće:

  • `bool(0)` vraća `Netačno`.
  • `bool()` vraća `Tačno`.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

Slično tome, kada konvertujemo Booleove vrednosti u cele brojeve, imamo sledeće:

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

Kombinujući konverziju tipova i indeksiranje, možemo da uradimo sledeće:

  • Element sa indeksom 0 u tuple-u: vrednost koja se koristi kada je `uslov` `Netačan`.
  • Element sa indeksom 1 u tuple-u: vrednost koja se koristi kada je `uslov` `Tačan`.

Koristeći gore navedeno, imamo sledeće:

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

Ovde je uslov `numVisits > 7` `Tačan` jer je `numVisits` 10. Pošto je `int(True)` 1, vrednost `discount_perc` je 20, što je element sa indeksom 1.

Simulacija ternarnog operatora pomoću Python rečnika

Možete koristiti `Tačno` i `Netačno` kao ključeve rečnika. Takođe, možete postaviti `izraz1` i `izraz2` kao vrednosti koje odgovaraju ključevima `Tačno` i `Netačno`, respektivno.

some_dict = {True: izraz1,
             False: izraz2
            }

Šta dalje? Ako sada koristite `some_dict[uslov]`, `izraz1` koji odgovara ključu `Tačno` se procenjuje ukoliko je `uslov` `Tačan`. S druge strane, `izraz2` se procenjuje kada je `uslov` `Netačan`.

Hajde da ponovo kodiramo primer `discount_perc`, ali ovaj put koristeći Python rečnik.

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

U ovom slučaju, `numVisits` je 10, što je veće od 7. Dakle, uslov `numVisits > 7` je `Tačan`. Stoga, `discount_dict[numVisits > 7]` se procenjuje na `discount_dict[True]` što je vrednost 20.

Da li uvek treba koristiti Python ternarni operator?

Do sada smo naučili kako se koristi ternarni operator. Međutim, da li je uvek preporučljivo koristiti ga? Odgovor je, ternarni operator možda nije najbolji izbor u svim slučajevima upotrebe. U ovom odeljku ćemo razmotriti kada je preporučljivo koristiti ternarni operator u odnosu na `if-else` iskaze. Takođe ćemo razmotriti kada bi trebalo da koristite `if-else` iskaze umesto ternarnog operatora.

Koncizniji od `if-else` blokova

Kao što je već pomenuto, u Pythonu, izraz ternarnog operatora je sažetiji od `if-else` iskaza. Stoga ga možete koristiti za proveru uslova i uslovno procenjivanje izraza u jednoj liniji.

U sledećem primeru, `nums` je lista od 100 nasumično generisanih celih brojeva. Za svaki od ovih 100 brojeva, proveravamo da li je paran ili neparan. Ova provera se obavlja unutar f-stringa.

import random

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

for num in nums:
    print(f"{num} is {'even' if num%2==0 else 'odd'}")
# Primer ispisa

0 is even
56 is even
6 is even
53 is odd
62 is even
7 is odd
8 is even
77 is odd
41 is odd
94 is even

Ternarni operator zahteva `else` klauzulu

Kada koristite uslovne `if-else` iskaze, `else` klauzula je opciona. Razmotrimo primer. Promenljiva `game_over` se postavlja na `Tačno` ako energija padne na vrednost manju ili jednaku nuli.

Međutim, ako je `energija` veća od nule, promenljiva `game_over` se nikada ne inicijalizuje. Stoga, naići ćete na grešku ako pokušate da pristupite promenljivoj `game_over`.

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

print(f"Is the game over? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"Is the game over? {game_over}")
NameError: name 'game_over' is not defined

Jedan od načina da se ovo ispravi je da se `game_over` inicijalno postavi na `Netačno` i da se ažurira na `Tačno` ako je nivo energije manji ili jednak nuli.

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

print(f"Is the game over? {game_over}")

Međutim, kada koristite ekvivalentni Python ternarni operator, `else` klauzula nije opciona. Ternarni operator zahteva da se izraz proceni čak i kada je uslov `Netačan`.

game_over = True if energy <= 0 else False

Ako gornji primer promenite u `game_over = True if energy <= 0` uklanjanjem `else` dela, naići ćete na sintaksnu grešku, kao što je prikazano:

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

Za proveru više uslova koristite `if-else` iskaze

Razmotrite sledeći primer: Svako pitanje u setu pitanja za intervju za posao ima pridruženu ocenu težine. U zavisnosti od te ocene, određenom pitanju dodeljujemo jedan od tri nivoa težine: lako, srednje ili teško. Pretpostavimo da imamo sledeće:

Ocena | Nivo težine
——-|————
Manje od 10 | lako
Između 10 i 20 | srednje
Veće od 20 | teško

S obzirom na ocenu težine, njen nivo možete dobiti koristeći Python ternarni operator kao što je prikazano:

score = 12

difficulty_level = "easy" if score < 10 else "hard" if score > 20 else "medium"

print(difficulty_level)
# medium

Izraz ternarnog operatora u gornjem bloku koda ima sledeći oblik:

izraz1 if uslov1 else izraz2 if uslov2 else izraz3

Iako je sažet, malo je teže čitati ga i analizirati. Sledeća slika ilustruje kako se kontrolni tok odvija u ovom slučaju.

Sledeći isečak koda prikazuje ekvivalentnu implementaciju koristeći `if-else` iskaze. Kao što se može videti, tok kontrole je mnogo lakši za razumevanje, a kod je čitljiviji.

if score < 10:
    difficulty_level="easy"
elif score > 20:
    difficulty_level="hard"
else:
    difficulty_level="medium"

print(difficulty_level)

Stoga, kada imate više uslova, trebalo bi da koristite `if-else` blokove umesto ternarnog operatora. Ovo osigurava da je kod lak za čitanje i razumevanje.

Takođe, kada je potrebno izvršiti više naredbi – u zavisnosti od toga da li je uslov `Tačan` ili `Netačan` – trebalo bi da razmislite o korišćenju `if-else` iskaza.

Zaključak

Evo rezimea onoga što ste naučili u ovom vodiču.

  • U Pythonu, ternarni operator se može koristiti sa sledećom sintaksom: `izraz1 if uslov else izraz2`.
  • Ponašanje ternarnog operatora možete simulirati koristeći Python tuple i rečnike.
  • Iako ternarni operator može biti konciznija alternativa `if-else` blokovima, trebalo bi da osigurate da je kod čitljiv. Radi poboljšanja čitljivosti koda, možete koristiti `if-else` iskaze umesto ternarnog operatora, posebno kada je potrebno povezati više uslova.

Zatim pogledajte vodič o operatorima jednakosti i nejednakosti u Pythonu.