12. diel - Cykly v Pythone druhýkrát - Výraz pass, break a continue
V minulej lekcii, Najčastejšie chyby Python začiatočníkov, robíš je tiež? , sme si ukázali najčastejšie chyby
začiatočníkov v Pythone, napr. Ohľadom pomenovanie kolekcií,
bool
výrazov a DRY.
V tomto tutoriále základov programovania v Pythone si
rozšírime znalosti o cykloch. Vysvetlíme si nové kľúčové slová
pass
, break
a continue
.
Na úvod by bolo dobré podotknúť, že dnešná lekcia obsahuje menej používané praktiky a slúži hlavne na to, aby nás neprekvapili v cudzom kóde. Nie je príliš dôležité ich vedieť používať.
Výraz pass
Povedzme, že chceme urobiť prázdny blok else
alebo
cyklus. V Pythone existuje tzv. no-op (no operation)
výraz, ktorý sa používa práve na označenie prázdneho bloku kódu. Sám
nemá absolútne žiadnu funkcionalitu. Tento výraz sa nazýva
pass
, a slúži práve na označenie prázdnych blokov
podmienok, cyklov, funkcií, dokonca aj tried. Používame ho prevažne
v prípadoch, keď potrebujeme tieto časti kódu z nejakého dôvodu
doplniť neskôr. Vyskúšajme si nasledujúci kód:
for a in range(0,10): print("Hotovo")
Tento program nám podľa očakávania hlási chybu:
Chybová hláška:
File"C:\Users\váš účet\PycharmProjects\pythonProject2\main.py", line 3
print("Hotovo")
^
IndentationError: expected an indented block after 'for' statement on line 1
Pridajme teda spomínaný príkaz pass
, ktorý programu oznámi,
že cyklus len prejde, ale nič zmysluplné pre nás nevykoná:
for a in range(0,10): pass print("Hotovo")
Ako v ukážke vidíme, program síce proiteruje celý cyklus, ale vo výsledku sa nič nestane
break
a continue
Beh cyklu je potrebné niekedy prerušiť. K tomu nám Python poskytuje dve
kľúčové slová, konkrétne break
a continue
.
break
Príkaz break
ukončuje aktuálny cyklus.
Používa sa najčastejšie v situácii, keď pomocou cyklu nájdeme nejakú
položku v kolekcii a ďalej už v jej prechádzaní nechceme pokračovať.
Nebudeme tak ďalej zbytočne prehľadávať zvyšok kolekcie, keď už
máme to, čo sme hľadali.
Príklad
Predstavme si, že máme pole položiek a chceme v nich nejakú nájsť. Že
môžeme použiť metódu Index()
alebo __contains()__
? Pokiaľ pôjde o zoznam, tak áno, ale niektoré kolekcie tieto metódy
nemajú a/alebo chceme hľadať pomocou nejakej inej vlastnosti, než ktorú
tieto metódy zohľadňujú. Potom si vyhľadávanie musíme napísať pekne
ručne cyklom, alebo použiť výrazne pokročilejšie konštrukcie, než teraz
ovládame.
Povedzme, že máme veľké a malé štítky na poháre a chceme použiť na všetky poháre buď jedny alebo druhé. Zaujíma nás teda, či sa text všetkých popisov zmestí na malé štítky. Napíšeme program, ktorý zistí, či je v poli slovo dlhšie ako šesť znakov. Pokiaľ áno, musíme použiť väčšie štítky.
Začneme teda cyklom prechádzať jednotlivé slová a akonáhle nájdeme
slovo dlhšie ako šesť znakov, uložíme si jeho index. Zatiaľ stále nič
nové pod slnkom. V tej istej chvíli však pomocou break
cyklus ukončíme:
seznamOvoce = ["Jablká", "Hrušky", "Slivky", "Marhule", "Jahody", "Čerešne"] hledanyIndex = -1 for ovoce in seznamOvoce: if len(ovoce)>6: hledanyIndex = seznamOvoce.index(ovoce) break if hledanyIndex >= 0: print("Prvé slovo dlhšie ako 6 znakov: " + seznamOvoce[hledanyIndex])
Výstup v konzole:
Přerušení cyklu pomocí příkazu break:
Prvé slovo dlhšie ako 6 znakov: Švestky
Príkaz break
sa v praxi často nahrádza príkazom
return
za predpokladu, že je kód v našej vlastnej funkcii.
Vlastnú funkciu sa ale naučíme deklarovať až lekciu Funkcie a výnimky v
Pythone.
Akonáhle sa v ďalšom priebehu kurzu naučíme pracovať s
funkciami, mali by sme používanie break
obmedziť. Správnejší
variant je kód pre prácu s kolekciou vyčleniť do samostatnej funkcie.
continue
Príkaz continue
je podobný nám už známemu príkazu
break
. Používa sa však na ukončenie iba aktuálnej iterácie
(priebehu) cyklu a nie celého cyklu. Cyklus potom rovno
prechádza na ďalšiu iteráciu. Príkaz continue
často
použijeme napr. pri validovaní položiek pri prechádzaní nejakej
kolekcie.
Príklad
Predstavme si, že máme od užívateľa zadané čísla. Tieto čísla
chceme sčítať. Užívateľ nám čísla zadá ako jeden reťazec, kde každé
číslo je oddelené čiarkou. Bohužiaľ musíme počítať aj s tým, že
používateľ zadá namiesto čísla nejaký nezmysel. Aby nám program
nekončil chybou, pretože parsovanie slova na číslo sa
nepodarí, budeme v ukážke jednotlivé reťazce testovať metódou
isdigit()
. Metóda porovnáva, či je text v skutočnosti číslo.
Výhodou tejto konštrukcie je, že nám program nespadne s chybovým
hlásením. Riešenie vyzerá nasledovne:
cislaRetezec = "10,50,abcd,30,9"
cislaPole = cislaRetezec.split(',')
soucet = 0
for cislo in cislaPole:
if not cislo.isdigit():
continue
else:
celeCislo = int(cislo)
soucet += celeCislo
print(f"Súčet je:{soucet}")
Výstup v konzole:
Použití metody isdigit() a příkazu continue:
Súčet je: 99
Program spočíta všetky správne zadané hodnoty, teda tie, pri ktorých
metóda isdigit()
vrátila hodnotu True
. Pri
nesprávne zadaných hodnotách je aktuálna iterácia ukončená. Miesto
continue
by sme samozrejme mohli použiť len príkaz
if
, kód by sme tým však zbytočne zanorili.
Nekonečný cyklus while
Nasledujúce konštrukcie sú tu pre ukážku, čo všetko je možné stretnúť v cudzích kódoch a nie je dobrý dôvod ich používať!
Pripomeňme si cyklus while
a jeho základné použitie:
a = 0 while a<10: a+=1 print(a)
Kód vykoná podľa očakávania desať iterácií, pričom v každej z nich
vytlačí aktuálne číslo do konzoly. Čo ak chceme mať cyklus, pri ktorom
vopred nebudeme poznať daný počet opakovaní? Teda potrebujeme cyklus, ktorý
sa opakuje do nekonečna, bez nejakej riadiacej premennej alebo podmienky. Na
tieto účely môžeme využiť tzv. nekonečný cyklus
while
. Jeho podoba je nasledujúca:
while True: # nekonečný cyklus
Ako podmienku sme dali rovnú hodnotu True
, teda akúsi
vyhodnotenú hodnotu logického výrazu, ktorý je vždy pravdivý. Tým sme
vytvorili konštrukciu, kedy sa cyklus vykonáva stále do nekonečna. Vďaka
nám už známemu príkazu break
potom môžeme z cyklu
vyskočiť.
Pre poriadok si uveďme orientačný príklad ukončenia nekonečného cyklu,
akonáhle hodnota premennej stúpne nad hodnotu 50
:
x = 0 while True: x += 1 if x >= 50: print(f"hodnota x je{x}") break print("Program úspešne skončil")
Akonáhle podmienka nie je priamo v deklarácii cyklu, je pomerne neprehľadné zistiť kedy cyklus vôbec skončí. Je potom veľmi ľahké nechtiac urobiť z takého cyklu nekonečný. To platí obzvlášť, keď z cyklu vyskakujeme viacerými podmienkami a nepokryjeme všetky možné prípady. Preto sa nekonečným cyklom budeme skôr vyhýbať.
To je pre dnešok všetko. Kód je opäť k dispozícii na stiahnutie na konci lekcie.