Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.


 

Předchozí článek
Řešené úlohy k 14. lekci Pythonu
Všechny články v sekci
Základní konstrukce jazyka Python
Přeskočit článek
(nedoporučujeme)
Cykly v Pythonu podruhé - Výraz pass, break a continue
Článek pro vás napsal Karel Zaoral
Avatar
Uživatelské hodnocení:
213 hlasů
Karel Zaoral
Aktivity