Lekce 15 - Podmínky potřetí - Ternární výraz a propadávací match
V předešlém cvičení, Řešené úlohy k 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 my bychom ho chtěli
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ě upovídaný 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 "ternární výraz" 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. Nicméně, ve většině případů zanořování spíše kód znepřehlední. Vznikají totiž dlouhé nebo podivně zalomené řádky a není na první pohled vidět, jaká čá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. 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 a oddělit je svislou čárou |
a neukončovat
každý blok pomocí :
. Celou skupinu tím vyřešíme pomocí
jediného case
.
Příklad - Čtvrtletí
Předpokládejme, že chceme podle měsíce v roce zjistit, jaké 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 vá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í.
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ý 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 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
jen pokud k němu
máte dobrý důvod, nicméně je 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ů dalšími
konstrukcemi a klíčovými slovy pass
, break
a
continue
.