Jak používat Python Ternary Operator

Tento návod vás provede používáním ternárního operátoru v programovacím jazyce Python. Osvojíte si jeho syntaxi a prozkoumáte několik praktických příkladů, abyste plně porozuměli jeho fungování.

Nejprve si připomeneme, jak funguje standardní podmínkový příkaz if-else. Následně se naučíme, jak napsat ekvivalentní konstrukci pomocí ternárního operátoru.

Poté si vyzkoušíme několik ukázkových kódů a ukážeme si, jak napodobit chování ternárního operátoru za pomoci n-tic a slovníků v Pythonu. V závěru se podíváme na situace, kdy je použití ternárního operátoru nejvhodnější.

Začněme!

Příkaz if-else v Pythonu: Opakování

Můžete si vyzkoušet kód v interaktivní konzoli Pythonu (REPL) nebo použít online Python editor, například etechblog.cz.

Obecná podoba syntaxe příkazu if-else v Pythonu je následující:

if podminka:
    # proveď toto
else:
    # proveď toto

V uvedeném fragmentu kódu podminka reprezentuje podmínku, která má být ověřena. Pokud je podminka vyhodnocena jako True, vykoná se blok kódu pod if. V opačném případě, pokud je podminka vyhodnocena jako False, vykonají se příkazy v bloku else.

Následující příklad demonstruje, jak se proměnné game_over přiřadí booleovská hodnota v závislosti na tom, zda je hodnota energie menší nebo rovna nule:

  • Pokud energie je menší nebo rovna 0, pak game_over je True.
  • V opačném případě je game_over False.

Následující kód ukazuje, jak to provést pomocí klasických podmíněných příkazů if-else:

energie = -1

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

print(game_over)
# True

V tomto příkladu je energie nastavena na -1, což je méně než 0. Proto game_over bude True.

Ternární operátor v Pythonu: Syntaxe a příklady

Python disponuje ternárním operátorem, který funguje obdobně jako ternární podmíněný operátor v jazycích jako C a C++. Jeho obecná syntaxe je:

vyraz1 if podminka else vyraz2

Pojďme si analyzovat výše uvedenou syntaxi:

  • podminka: Podmínka, která se má ověřit.
  • vyraz1: Výraz, který se vyhodnotí, pokud je podminka pravdivá (True).
  • vyraz2: Výraz, který se vyhodnotí, pokud je podminka nepravdivá (False).

Nyní zjistíme, jaké hodnoty by měly být přiřazeny proměnným vyraz1, vyraz2 a podminka z ekvivalentního kódu if-else.

Když to všechno spojíme, dostáváme následující kód s použitím ternárního operátoru v Pythonu.

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

Pojďme si ukázat další příklad. Představte si, že provozujete knihkupectví a poskytujete zákazníkům slevu v závislosti na tom, jak často za poslední rok navštívili váš obchod.

Proměnná pocetNavstev bude reprezentovat počet návštěv.

  • Pokud je pocetNavstev > 7, pak je procento slevy, sleva_procent, rovno 20.
  • V opačném případě je sleva_procent rovno 5.

Použijeme ternární operátor k přiřazení hodnoty proměnné sleva_procent.

pocetNavstev = 10

sleva_procent = 20 if pocetNavstev > 7 else 5

print(sleva_procent)
# 20 (protože pocetNavstev = 10, což je > 7)

Dále se naučíme, jak napodobit ternární operátor pomocí n-tic a slovníku v Pythonu.

Napodobení ternárního operátoru pomocí n-tic v Pythonu

N-tice v Pythonu, stejně jako všechny iterovatelné objekty, používají nulové indexování. Pokud tedy máte dva prvky v n-tici, nazev_ntice[0] odkazuje na první prvek v n-tici a nazev_ntice[1] na druhý prvek.

Základní datové typy v Pythonu jsou integer, float, string a boolean. Python podporuje přetypování, které vám umožňuje reprezentovat konkrétní datový typ pomocí jeho ekvivalentní reprezentace v jiném datovém typu.

Spusťte Python REPL a vyzkoušejte si následující příklady. Pokud se pokusíte převést celá čísla na booleovské hodnoty, všimnete si následujícího:

  • bool(0) je False.
  • bool() vrátí True.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

Podobně, když přetypujete booleovské hodnoty na celá čísla, dostaneme:

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

Kombinací přetypování a indexování, můžeme dosáhnout následujícího:

  • Prvek na indexu 0 v n-tici: Hodnota, která se použije, pokud je podminka False.
  • Prvek na indexu 1 v n-tici: Hodnota, která se použije, pokud je podminka True.

Pomocí výše uvedeného můžeme napsat:

>>> pocetNavstev = 10
>>> sleva_procent = (5, 20)[pocetNavstev > 7]
>>> sleva_procent
# 20

Zde je podminka, pocetNavstev > 7, True, protože pocetNavstev je 10. Protože int(True) je 1, hodnota sleva_procent bude 20, což je prvek na indexu 1.

Napodobení ternárního operátoru pomocí slovníku v Pythonu

Jako klíče slovníku můžete použít True a False. A vyraz1 a vyraz2 můžete nastavit jako hodnoty odpovídající klíčům True a False.

nejaky_slovnik = {True: vyraz1,
             False: vyraz2
            }

Co bude dál? Nyní, pokud použijete nejaky_slovnik[podminka], výraz vyraz1 odpovídající klíči True se vyhodnotí, pokud je podminka True. A vyraz2 se vyhodnotí, když je podminka False.

Pojďme si ukázat příklad s sleva_procent (opět), ale tentokrát za použití slovníku v Pythonu.

>>> pocetNavstev = 10
>>> sleva_slovnik = {True: 20, False: 5}
>>> sleva_procent = sleva_slovnik[pocetNavstev > 7]
>>> sleva_procent
# 20

Zde pocetNavstev je 10, což je více než 7. Proto podminka, pocetNavstev > 7, je True. Tudíž sleva_slovnik[pocetNavstev > 7] se vyhodnotí jako sleva_slovnik[True], což je hodnota 20.

Měli byste vždy používat ternární operátor v Pythonu?

Zatím jsme se naučili používat ternární operátor. Měli bychom ho ale používat vždy? Ne, ternární operátor nemusí být ideální volbou pro všechny situace. Tato část se zabývá tím, kdy byste měli preferovat použití ternárního operátoru před příkazy if-else. Také se podíváme na to, kdy je vhodnější použít if-else místo ternárního operátoru.

Stručnější než bloky if-else

Jak již bylo zmíněno, ternární operátor v Pythonu je stručnější než příkaz if-else. Proto ho můžete použít pro kontrolu podmínek a podmíněné vyhodnocování výrazů přímo v kódu.

V následujícím příkladu je cisla seznam 100 náhodně generovaných celých čísel. Pro každé z těchto 100 čísel ověříme, zda je liché nebo sudé. Toto vyhodnocení probíhá přímo uvnitř f-řetězce.

import random

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

for cislo in cisla:
    print(f"{cislo} je {'sude' if cislo%2==0 else 'liche'}")
# ukázkový výstup

0 je sude
56 je sude
6 je sude
53 je liche
62 je sude
7 je liche
8 je sude
77 je liche
41 je liche
94 je sude

Ternární operátor vyžaduje klauzuli else

Při použití podmíněných příkazů if-else je klauzule else volitelná. Vezměme si příklad, kde je proměnná game_over nastavena na True, pokud energie klesne na hodnotu menší nebo rovnou nule.

Pokud je však energie větší než nula, proměnná game_over není inicializována. Pokud se tedy pokusíte k game_over přistoupit, narazíte na chybu.

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

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

Jedním ze způsobů, jak toto opravit, je nejprve nastavit game_over na False a aktualizovat ji na True, pokud je úroveň energie menší nebo rovna nule.

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

print(f"Je hra u konce? {game_over}")

Při použití ekvivalentního ternárního operátoru Pythonu, klauzule else není volitelná. Ternární operátor vyžaduje, aby byl výraz vyhodnocen, i když je podminka False.

game_over = True if energie <= 0 else False

Pokud změníte výše uvedené na game_over = True if energie <= 0 odstraněním části else, narazíte na chybu syntaxe:

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

Pro kontrolu více podmínek použijte příkazy if-else

Uvažujme příklad: Každá otázka v sadě otázek kódovacího rozhovoru má přiřazené skóre obtížnosti. V závislosti na tomto skóre přiřadíme konkrétní otázce jednu ze tří úrovní obtížnosti: snadná, střední nebo těžká. Předpokládejme, že máme následující:

Skóre Úroveň Obtížnosti
Méně než 10 snadná
Mezi 10 a 20 střední
Větší než 20 těžká

Vzhledem ke skóre obtížnosti, můžete zjistit jeho úroveň pomocí ternárního operátoru Pythonu, jak je ukázáno:

skore = 12

uroven_obtiznosti = "snadna" if skore < 10 else "tezka" if skore > 20 else "stredni"

print(uroven_obtiznosti)
# stredni

Výraz ternárního operátoru v uvedeném bloku kódu má následující formu:

vyraz1 if podminka1 else vyraz2 if podminka2 else vyraz3

I když je stručný, je trochu obtížné ho číst a analyzovat. Následující obrázek ukazuje, jak v tomto případě probíhá řídicí tok.

Následující fragment kódu ukazuje ekvivalentní implementaci pomocí příkazů if-else. Jak je vidět, řídicí tok je mnohem srozumitelnější a kód je čitelnější.

if skore < 10:
    uroven_obtiznosti = "snadna"
elif skore > 20:
    uroven_obtiznosti = "tezka"
else:
    uroven_obtiznosti = "stredni"

print(uroven_obtiznosti)

Pokud tedy máte více podmínek, měli byste namísto ternárního operátoru použít bloky if-else. Zajišťuje se tím snadná čitelnost kódu a jeho srozumitelnost.

Také, pokud potřebujete vykonat více příkazů – v závislosti na tom, zda je podminka True nebo False – měli byste zvážit použití příkazu if-else.

Závěr

Zde je shrnutí toho, co jste se v tomto tutoriálu naučili:

  • V Pythonu lze ternární operátor použít s následující syntaxí: vyraz1 if podminka else vyraz2.
  • Chování ternárního operátoru můžete napodobit pomocí n-tic a slovníků v Pythonu.
  • I když ternární operátor může být stručnější alternativou k blokům if-else, měli byste zajistit, aby byl kód čitelný. Pro zlepšení čitelnosti kódu můžete místo ternárního operátoru použít příkazy if-else, zejména pokud potřebujete zřetězit více podmínek.

Dále se podívejte na tutoriál o operátorech rovnosti a nerovnosti v Pythonu.