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, pakgame_over
jeTrue
. - 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 jepodminka
pravdivá (True
).vyraz2
: Výraz, který se vyhodnotí, pokud jepodminka
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)
jeFalse
.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říkazyif-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.