15. diel - Podmienky tretíkrát - Ternárny výraz a prepadávací match
V predchádzajúcom cvičení, Riešené úlohy k 14. lekcii Pythonu, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnom Python tutoriále si predstavíme dve ďalšie konštrukcie,
ktoré súvisia s podmienkami. Konkrétne pôjde o ternárne
výrazy a prepadávanie v konštrukcii
match
. Ide o oddychový tutoriál, ktorým túto tému
dokončíme.
Ternárny operátor
Často sa nám stáva, že niekde potrebujeme nastaviť dve rôzne hodnoty podľa toho, či platí nejaká podmienka.
Príklad – Výpis pohlavia
Predstavme si, že máme napr. pohlavie užívateľa uložené ako
bool
(muž by bol True
) a chceme ho previesť do
textu. S doterajšími znalosťami by sme napísali asi takýto kód:
man = True # variable determining gender
gender_name = ""
if man:
gender_name = "man"
else:
gender_name = "woman"
print(gender_name)
Výstup programu je samozrejme nasledujúci:
Conditional output:
man
Kód je pomerne rozsiahly na to, že iba prepína medzi dvoma hodnotami. Preto programovacie jazyky často podporujú tzv. ternárny výraz.
Syntax ternárneho výrazu
Pomocou tohto operátora môžeme získať hodnotu podľa platnosti logického výrazu. Zapíšeme ho takto:
first_value if (expression) else second_value
Zátvorka pre vyhodnocovaný výraz 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 first_value
, 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 výrazu je odvodený od
toho, že má tri časti (prvú hodnotu, podmienku a druhú
hodnotu), preto ternárne.
Príklad – Výpis pohlavia pomocou ternárneho výrazu
Poďme si ternárny operátor vyskúšať na príklade s pohlavím:
man = True # variable determining gender
gender_name = "man" if (man) else "woman"
print(gender_name)
Namiesto dátového typu bool
samozrejme môžeme
do zátvorky napísať akúkoľvek inú podmienku, napríklad
"adult" if (age >= 18) else "child"
. V prípade
jednoduchých výrazov môžeme zátvorku aj vynechať.
Vnáranie ternárnych výrazov
Ternárne operátory je možné teoreticky zanárať do seba a tým reagovať aj na tri a viac hodnôt. Zanáranie však vo väčšine prípadov kód skôr zneprehľadní. Vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, ktorá časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovania ternárnych výrazov vyriešil výpis troch smajlíkov:
smiley = ":)"
mood = "happy" if smiley == ":)" else "sad" if smiley == ":(" else "unknown"
print(mood)
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.
Konštrukcia match
s
prepadávaním
S konštrukciou match
sme sa už stretli v lekcii Podmienky
(vetvenia) druhýkrát – Konštrukcia match v Pythone. Dnes si ukážeme
jej ďalšie použitie. Python vie v konštrukcii match
využiť
jeden zaujímavý variant, tzv. prepadávanie. Ak potrebujeme
vo viacerých blokoch case
vykonávať rovnaký kód, stačí ich
hodnoty vložiť za seba, oddeliť ich zvislou čiarou |
a
neukončovať každý blok pomocou :
. Celú skupinu tým vyriešime
pomocou jediného bloku case
.
Príklad – Štvrťrok
Predpokladajme, že chceme podľa mesiaca v roku zistiť, ktorý je
štvrťrok. Pomocou blokov if
a else
by príklad
vyzeral nasledovne:
month = 2
if 1 <= month <= 3:
print("It's the first quarter.")
elif 4 <= month <= 6:
print("It's the second quarter.")
elif 7 <= month <= 9:
print("It's the third quarter.")
elif 10 <= month <= 12:
print("It's the fourth quarter.")
Zápis 1 <= month <= 3
zodpovedá použitiu
and
a je ekvivalentný k "tradičnému" zápisu podmienky
month >= 1 and month <= 3
. Je kratšia a prehľadnejšia. V
Pythone sa často používa.
Ako ale použiť konštrukciu match
pre takýto príklad? Možno
by nás napadol nasledujúci zápis:
month = 11
match month:
case 1:
print("It's the first quarter.")
case 2:
print("It's the first quarter.")
case 3:
print("It's the first quarter.")
case 4:
print("It's the second quarter.")
case 5:
print("It's the second quarter.")
case 6:
print("It's the second quarter.")
case 7:
print("It's the third quarter.")
case 8:
print("It's the third quarter.")
case 9:
print("It's the third quarter.")
case 10:
print("It's the fourth quarter.")
case 11:
print("It's the fourth quarter.")
case 12:
print("It's the fourth quarter.")
Príklad funguje spoľahlivo, problém však je, že sme si týmto zápisom veľmi nepomohli. 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. Bloky s
rovnakým výstupom sa zjednotia pomocou znaku |
:
month = 11
match (month):
case 1 | 2 | 3:
print("It's the first quarter.")
case 4 | 5 | 6:
print("It's the second quarter.")
case 7 | 8 | 9:
print("It's the third quarter.")
case 10 | 11 | 12:
print("It's the fourth quarter.")
Je to oveľa lepšie ako vypisovať samostatný blok case
pre
každý z 12 mesiacov, však? Výstup programu potom bude vyzerať
nasledovne:
Using match with fallthrough:
It's the fourth quarter.
Tento 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äčší/menší a kedy ide o zoznam hodnôt.
Prepadávanie používajte v konštrukcii match
iba vtedy, ak
máte k nemu dobrý dôvod. Je však dôležité, aby ste ho vedeli čítať,
keď naň niekde narazíte.
V budúcej lekcii, Cykly v Pythone druhýkrát - Výraz pass, break a continue, rozšírime naše znalosti cyklov o ďalšie
konštrukcie a kľúčové slová pass
, break
a
continue
.