Lekce 15 - Podmínky potřetí - Ternární výraz a propadávací match
V předešlém cvičení, Řešené úlohy ke 14. lekci Pythonu, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním Python tutoriálu si představíme dvě další konstrukce,
které souvisejí s podmínkami. Konkrétně půjde o ternární
výrazy a propadávání v konstrukci
match
. Jedná se o oddechový tutoriál, kterým toto téma
dokončíme.
Ternární operátor
Často se nám stává, že někde potřebujeme nastavit dvě různé hodnoty podle toho, zda platí nějaká podmínka.
Příklad – Výpis pohlaví
Představme si, že máme např. pohlaví uživatele uložené jako
bool
(muž by byl True
) a chceme ho převést do
textu. S dosavadními znalostmi bychom napsali asi takovýto kód:
muz = True # nějaká proměnná udávající pohlaví
nazev_pohlavi = ""
if muz:
nazev_pohlavi = "muž"
else:
nazev_pohlavi = "žena"
print(nazev_pohlavi)
Výstup programu je samozřejmě následující:
Výstup podmínky:
muž
Kód je poměrně rozsáhlý na to, že jen přepíná mezi dvěma hodnotami. Proto programovací jazyky často podporují tzv. ternární výraz.
Syntaxe ternárního výrazu
Pomocí tohoto operátoru můžeme získat hodnotu podle platnosti logického výrazu. Zapíšeme jej takto:
prvni_hodnota if (vyraz) else druha_hodnota
Závorka pro vyhodnocovaný výraz není nutná, je zde jen pro přehlednost a lepší orientaci. V praxi se však téměř nepoužívá.
Nejprve začíná prvni_hodnota
, určená pro případ, že
výraz je True
. Následuje samotný výraz podmínky, který je pro
přehlednost umístěn do nepovinné závorky, a poté else
pro
případ, že podmínka nabývá hodnoty False
. Jak snadné! Název výrazu je odvozený od
toho, že má tři části (první hodnotu, podmínku a druhou
hodnotu), proto ternární.
Příklad – Výpis pohlaví pomocí ternárního výrazu
Pojďme si ternární operátor vyzkoušet na příkladu s pohlavím:
muz = True # nějaká proměnná udávající pohlaví
nazev_pohlavi = "muž" if (muz) else "žena"
print(nazev_pohlavi)
Místo datového typu bool
samozřejmě můžeme do
závorky napsat jakoukoli jinou podmínku, například
"zletilý" if (vek >= 18) else "nezletilý"
. V
případě jednoduchých výrazů můžeme závorku i vynechat.
Vnořování ternárních výrazů
Ternární operátory lze teoreticky zanořovat do sebe a tím reagovat i na tři a více hodnot. Zanořování však ve většině případů kód spíše znepřehlední. Vznikají totiž dlouhé nebo podivně zalomené řádky a není na první pohled vidět, která část se kdy spustí. Ukažme si, jak by se pomocí vnořování ternárních výrazů vyřešil výpis tří smajlíků:
smajlik = ":)"
nalada = "veselý" if smajlik == ":)" else "smutný" if smajlik == ":(" else "neznámý"
print(nalada)
Pro příklad výše by bylo mnohem lepší vytvořit vlastní metodu, což si ale ukážeme až v navazujícím kurzu Objektově orientované programování v Pythonu.
Konstrukce match
s
propadáváním
S konstrukcí match
jsme se již setkali v lekci Podmínky
(větvení) podruhé – Konstrukce match v Pythonu. Dnes si ukážeme její
další použití. Python umí v konstrukci match
využít jednu
zajímavou variantu, tzv. propadávání. Pokud potřebujeme ve
více blocích case
provádět stejný kód, stačí jejich hodnoty
vložit za sebe, oddělit je svislou čárou |
a neukončovat
každý blok pomocí :
. Celou skupinu tím vyřešíme pomocí
jediného bloku case
.
Příklad – Čtvrtletí
Předpokládejme, že chceme podle měsíce v roce zjistit, které je
čtvrtletí. Pomocí bloků if
a else
by příklad
vypadal následovně:
mesic = 2
if 1 <= mesic <= 3:
print("Je první čtvrtletí.")
elif 4 <= mesic <= 6:
print("Je druhé čtvrtletí.")
elif 7 <= mesic <= 9:
print("Je třetí čtvrtletí.")
elif 10 <= mesic <= 12:
print("Je čtvrté čtvrtletí.")
Zápis 1 <= mesic <= 3
odpovídá použití
and
a je ekvivalentní k "tradičnímu" zápisu podmínky
mesic >= 1 and mesic <= 3
. Je kratší a přehlednější. V
Pythonu se často používá.
Jak ale použít konstrukci match
pro takovýto příklad?
Možná by nás napadl následující zápis:
mesic = 11
match mesic:
case 1:
print("Je první čtvrtletí.")
case 2:
print("Je první čtvrtletí.")
case 3:
print("Je první čtvrtletí.")
case 4:
print("Je druhé čtvrtletí.")
case 5:
print("Je druhé čtvrtletí.")
case 6:
print("Je druhé čtvrtletí.")
case 7:
print("Je třetí čtvrtletí.")
case 8:
print("Je třetí čtvrtletí.")
case 9:
print("Je třetí čtvrtletí.")
case 10:
print("Je čtvrté čtvrtletí.")
case 11:
print("Je čtvrté čtvrtletí.")
case 12:
print("Je čtvrté čtvrtletí.")
Příklad funguje spolehlivě, problém však je, že jsme si tímto zápisem moc nepomohli. Podobnému repetitivnímu kódu bychom se vždy měli vyhýbat.
Propadávání
Zkusme to ještě jednou a využijme tzv. propadávání.
V následující ukázce použijeme znak |
. Na
české klávesnici ho napíšeme pomocí pravý ALT a písmene
W:
Bloky se stejným výstupem se sjednotí pomocí znaku |
:
mesic = 11
match (mesic):
case 1 | 2 | 3:
print("Je první čtvrtletí.")
case 4 | 5 | 6:
print("Je druhé čtvrtletí.")
case 7 | 8 | 9:
print("Je třetí čtvrtletí.")
case 10 | 11 | 12:
print("Je čtvrté čtvrtletí.")
Je to mnohem lepší než vypisovat samostatný blok case
pro
každý z 12 měsíců, že? Výstup programu pak bude vypadat následovně:
Použití match s propadáváním:
Je čtvrté čtvrtletí.
Tento zápis je již mnohem přehlednější. Konstrukce match
má ovšem přidanou hodnotu v případě, kdy nemůžeme použít
větší/menší a kdy jde o výčet hodnot. Zde je to spíše redundantní kód
plný prázdných case
.
Propadávání používejte v konstrukci match
jenom tehdy,
máte-li k němu dobrý důvod. Je však důležité, abyste jej uměli číst,
když na něj někde narazíte.
V příští lekci, Cykly v Pythonu podruhé - Výraz pass, break a continue, rozšíříme naše znalosti cyklů o další
konstrukce a klíčová slova pass
, break
a
continue
.