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í.

11. diel - Podmienky v Pythone druhýkrát - Ternárny výraz a match

V predchádzajúcom cvičení, Riešené úlohy k 8.-10. lekciu Pythone, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V dnešnom tutoriále základov v Pythone si predstavíme dve ďalšie konštrukcie, ktoré súvisia s podmienkami. Konkrétne pôjde o ternárny výraz a konštrukciu match.

Ternárny výraz

Často sa nám stáva, že niekde potrebujeme nastaviť dve rôzne hodnoty podľa toho, či platí nejaká podmienka. Predstavme si, že máme napríklad pohlavie užívateľa uložené vo forme bool, kde muž nadobúda hodnotu True. Túto premennú chceme previesť do textu. S doterajšími znalosťami by sme napísali pomocou podmienok nasledujúci kód:

muz = True # nejaká premenná udávajúca pohlavie
nazevPohlavi = ""
if (muz):
    nazevPohlavi = "muž"
else
    nazevPohlavi = "žena"
print(nazevPohlavi)

Výstup programu je samozrejme nasledujúci:

VVýstup podmínky:
muž

Kód je pomerne ukecaný na to, že len prepína medzi dvoma hodnotami. Preto programovacie jazyky často podporujú tzv. ternárny výraz.

Syntax ternárneho výrazu

Pomocou tohto ternárneho výrazu získame hodnotu podľa platnosti logického výrazu. Zapíšeme ho takto:

hodnota1 if (výraz) else hodnota2

Zátvorka pre vyhodnocovaný výraz v ukážke tu nie je nutná, je tu len pre prehľadnosť a lepšiu orientáciu. V praxi sa však takmer nepoužíva.

Najprv začína hodnota1, určená pre prípad, že výraz je True. Nasleduje samotný výraz podmienky, ktorý je pre prehľadnosť umiestnený do nepovinnej zátvorky, a potom else pre prípad, že podmienka nadobúda hodnotu False. Ako ľahké!:) Názov "ternárny výraz" je odvodený od toho, že má tri časti: prvú hodnotu, podmienku a druhú hodnotu. Preto sa mu hovorí ternárne.

Pojem "ternárny výraz" používa ako synonymum pre "ternárny operátor" a tieto pojmy sú vo všeobecnom kontexte zameniteľné. Oba pojmy popisujú rovnaký konštrukt, ktorý umožňuje vyhodnotenie podmienky a vrátenie jedného z dvoch rôznych výrazov v závislosti od výsledku tejto podmienky.

Príklad - Výpis pohlavia

Poďme si ternárny výraz vyskúšať na príklade s pohlavím. Náš kód upravíme do nasledujúcej podoby:

muz = False # nejaká premenná udávajúca pohlavie
nazevPohlavi =  "muž" if (muz) else "žena"
print(nazevPohlavi)

Namiesto dátového typu bool samozrejme môžeme do zátvorky napísať akúkoľvek inú podmienku, napríklad " plnoletý " if(vek >= 18) else " maloletý " V prípade jednoduchých " plnoletý " if(vek >= 18) else " maloletý " môžeme zátvorku aj vynechať.

Vnáranie ternárnych výrazov

Ternárne výrazy je možné teoreticky zanárať do seba a tým reagovať aj na tri a viac hodnôt. Avšak, vo väčšine prípadov zanáranie skôr kód zneprehľadní. Vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, aká časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovania ternárnych výrazov vyriešil výpis troch pohlaví:

pohlavi = "neviem" # nejaká premenná udávajúca pohlavie
nazevPohlavi = "muž" if(pohlavi == "muž") else "žena" if (pohlavi == "žena") else "nezname"
print(nazevPohlavi)

Pre príklad vyššie by bolo oveľa lepšie vytvoriť vlastnú metódu, čo si ale ukážeme až v nadväzujúcom kurze Objektovo orientované programovanie v Pythone

Ternárny výraz je spravidla určený na výber hodnoty. Nepoužíva sa na rozlíšenie volania metód bez návratového typu.

match s prepadávaním

S konštrukciou match sme sa už stretli v lekcii Podmienky a vetvenia v Pythone. Dnes si ukážeme jej ďalšie použitie, ktoré určite využijeme v prípade, keď potrebujeme, aby jeden case dokázal obslúžiť viac stavov naraz. Je to súčasťou štandardnej gramatiky Pythona a bežne sa vyskytuje v cudzích zdrojových kódoch, s ktorými sa v praxi stretneme.

Príklad - Štvrťrok

Predpokladajme, že chceme podľa mesiaca v roku zistiť, aký je štvrťrok. Pomocou if a else príklad vyzerá nasledovne:

mesic = 2
if (mesic >= 1 and mesic <= 3):
    print("Je prvý štvrťrok.")
elif (mesic >= 4 and mesic <= 6):
    print("Je druhý štvrťrok.")
elif (mesic >= 7 and mesic <= 9):
    print("Je tretí štvrťrok.")
elif (mesic >= 10 and mesic <= 12):
    print("Je štvrtý štvrťrok.")

Ako ale použiť match pre takýto príklad? Nasledujúci zápis síce funguje spoľahlivo, ale nepekne odporuje princípu DRY:

mesic = 11
match (mesic):
    case 1:
        print("Je prvý štvrťrok.")
    case 2:
        print("Je prvý štvrťrok.")
    case 3:
        print("Je prvý štvrťrok.")
    case 4:
        print("Je druhý štvrťrok.")
    case 5:
        print("Je druhý štvrťrok.")
    case 6:
        print("Je druhý štvrťrok.")
    case 7:
        print("Je tretí štvrťrok.")
    case 8:
        print("Je tretí štvrťrok.")
    case 9:
        print("Je tretí štvrťrok.")
    case 10:
        print("Je štvrtý štvrťrok.")
    case 11:
        print("Je štvrtý štvrťrok.")
    case 12:
        print("Je štvrtý štvrťrok.")

Podobnému repetitívnemu kódu by sme sa vždy mali vyhýbať.

Prepadávanie

Skúsme to ešte raz a využime tzv. prepadávanie. Ak potrebujeme vo viacerých blokoch case vykonávať rovnaký kód, stačí ich hodnoty vložiť za seba a oddeliť ich zvislou čiarou | a neukončovať každý blok pomocou :. Celú skupinu tým vyriešime pomocou jediného case:

mesic = 11
match (mesic):
    case 1 | 2 | 3:
        print("Je prvý štvrťrok.")
    case 4 | 5 | 6:
        print("Je druhý štvrťrok.")
    case 7 | 8 | 9:
        print("Je tretí štvrťrok.")
    case 10 | 11 | 12:
        print("Je štvrtý štvrťrok.")

To už je oveľa lepšie, že? Výstup programu potom bude vyzerať nasledovne:

Použití match s propadáváním:
Je štvrtý štvrťrok.

Vyššie uvedený zápis je už oveľa prehľadnejší. Konštrukcia match má však pridanú hodnotu v prípade, keď nemôžeme použiť väčšie/menšie a ide o zoznam hodnôt.

Prepadávanie používame v match, iba ak k nemu máme dobrý dôvod. Je však dôležité vedieť ho čítať, keď naň niekde narazíme.

V budúcej lekcii, Cykly v Pythone druhýkrát - Výraz pass, break a continue , rozšírime naše znalosti cyklov ďalšími konštrukciami a kľúčovými slovami pass, break a continue.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 158x (2.49 kB)

 

Predchádzajúci článok
Riešené úlohy k 8.-10. lekciu Pythone
Všetky články v sekcii
Základné konštrukcie jazyka Python
Preskočiť článok
(neodporúčame)
Cykly v Pythone druhýkrát - Výraz pass, break a continue
Článok pre vás napísal Vašek Doškář
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor pracuje jako pedagog v oblasti elektroniky, elektrotechniky a programování. Rád tvoří appky všeho druhu. Má přehled v jazycích C#, Java, Kotlin, Javascript, Python a Rust
Aktivity