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 podmienkamiStiahnuté 158x (2.49 kB)