16. diel - Cykly v Pythone druhýkrát - Výraz pass, break a continue
V minulej lekcii, Podmienky tretíkrát - Ternárny výraz a prepadávací match, sme sa venovali ďalšej syntaxi podmienok.
V dnešnom Python tutoriále si rozšírime znalosti o cykloch. Pozrieme sa
na príkazy pass
, break
a continue
.
Tutoriál obsahuje menej používané praktiky a slúži hlavne na to, aby vás
neprekvapili v cudzom kóde. Zatiaľ nie je príliš dôležité, aby ste ich
sami vedeli používať.
Príkaz pass
Príkaz pass
slúži na označenie prázdnych blokov
podmienok, cyklov, funkcií, a 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("Done")
Tento program nám podľa očakávania hlási chybu:
Error message:
File"C:\Users\itnetwork\PycharmProjects\cycles\main.py", line 3
print("Done")
^
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č nevykoná:
for a in range(0,10):
pass
print("Done")
Ako vidíme v ukážke, program síce proiteruje celý cyklus, ale vo výsledku sa nič nestane
Príkazy break
a
continue
Beh cyklu je potrebné niekedy prerušiť, k čomu máme nasledujúce dve kľúčové slová.
Príkaz 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 s využitím príkazu
break
Predstavme si, že máme zoznam položiek a chceme v nich nejakú nájsť.
Možno nás napadne, že môžeme použiť metódu index()
, výraz
in
alebo magickú metódu __contains__()
. Ak pôjde o
zoznam, tak áno, ale niektoré kolekcie tieto metódy nemajú alebo chceme
hľadať pomocou nejakej vlastnosti, ktorú tieto metódy nezohľadňujú. Potom
musíme vyhľadávanie napísať ručne cyklom alebo použiť výrazne
pokročilejšie konštrukcie, než teraz ovládame.
Magickým metódam sa podrobne venujeme v nadväzujúcom kurze Objektovo orientovaného programovania v Pythone.
Povedzme, že máme veľké a malé štítky na poháre a chceme použiť na všetky poháre buď jedny štítky, 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 zozname 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. Avšak v tej istej chvíli cyklus pomocou
break
ukončíme:
fruit_list = ["Apples", "Pears", "Plums", "Apricots", "Strawberries", "Cherries"]
index = -1
for fruit in fruit_list:
if len(fruit) > 6:
index = fruit_list.index(fruit)
break
if index >= 0:
print(f"First word longer than 6 characters: {fruit_list[index]}")
Výstup programu:
Breaking the loop using the break statement:
First word longer than 6 characters: Apricots
Príkaz break
sa v praxi často nahrádza príkazom
return
za predpokladu, že je kód v našej vlastnej funkcii.
Vlastné funkcie sa naučíme deklarovať v lekcii Funkcie a výnimky v
Pythone. Akonáhle sa v ďalšom priebehu kurzu naučíme s funkciami
pracovať, mali by sme používanie break
obmedziť. Správnejším
variantom je kód pre prácu s kolekciou vyčleniť do samostatnej funkcie.
Príkaz continue
Príkaz continue
je podobný 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 s využitím
continue
Predstavme si, že máme od užívateľa zadané čísla a 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 zistí, č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:
numbers_string = "10,50,abcd,30,9"
numbers_list = numbers_string.split(',')
total = 0
for item in numbers_list:
if not item.isdigit():
continue
else:
number = int(item)
total += number
print(f"The sum is: {total}")
Výstup programu:
Using the isdigit() method and the continue statement:
The sum is: 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 iba pre ukážku, čo všetko je možné stretnúť v cudzích kódoch, a nie je dobrý nápad 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 však chceme mať cyklus, pri
ktorom vopred nebudeme poznať daný počet opakovaní? Teda ak potrebujeme
cyklus, ktorý sa opakuje donekoneč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: # infinite cycle
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 donekonečna. Vďaka 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"The value of x is {x}")
break
print("The program has successfully ended.")
Akonáhle podmienka nie je priamo v deklarácii cyklu, je pomerne neprehľadné zistiť, kedy cyklus vôbec skončí. Potom je veľmi ľahké nechtiac urobiť z takého cyklu nekonečný. To platí obzvlášť v prípade, 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ť.
Príkaz else
v cykloch
for
a while
Už sme sa dôkladne zoznámili s tým, ako v Pythone používať cykly
for
a while
na opakovanie určitej činnosti. Ale čo
ak chceme vykonať nejakú činnosť po dokončení cyklu, ak cyklus
nebol predčasne ukončený pomocou break
? Tu prichádza
na rad príkaz else
.
Príkaz else
sa spustí po dokončení cyklu, ak
cyklus nebol ukončený príkazom break
.
Uveďme si príklad. Predstavme si, že hľadáme číslo v zozname a chceme vypísať správu, ak sa dané číslo v zozname nenachádza:
numbers = [1, 2, 3, 4, 5]
for number in numbers:
if number == 6:
print("Number 6 has been found!")
break
else:
print("Number 6 is not in the list.")
Pretože číslo 6
v našom zozname nie je, spustí sa príkaz
else
a vypíše sa správa
Number 6 is not in the list.
Pokiaľ by sme však číslo
6
v zozname mali a cyklus by bol predčasne ukončený príkazom
break
, príkaz else
by sa nevykonal. Pre cyklus
while
sa else
používa úplne rovnako, ako sme si to
ukázali v príklade s cyklom for
.
Je dôležité si uvedomiť, že použitie else
v
cykloch nie je vhodné pre všetky situácie a mali by sme ho zvážiť na
základe konkrétneho kontextu. V mnohých prípadoch môže byť kód
zrozumiteľnejší bez použitia else
.
To je pre dnešok všetko
V budúcej lekcii, Funkcie a výnimky v Pythone, sa pozrieme na vytváranie vlastných funkcií a ošetrenie chýb v programe.