IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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.


 

Predchádzajúci článok
Podmienky tretíkrát - Ternárny výraz a prepadávací match
Všetky články v sekcii
Základná konštrukcia jazyka Python
Preskočiť článok
(neodporúčame)
Funkcie a výnimky v Pythone
Článok pre vás napísal Vašek Doškář
Avatar
Užívateľské hodnotenie:
2 hlasov
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