Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

6. diel - Cykly v Pythone

V predchádzajúcej lekcii sme sa naučili používať podmienky, v tej dnešnej si povieme niečo o cykloch.

Cykly

Ako už slovo cyklus napovie, niečo sa bude opakovať. Keď chceme v programe niečo urobiť 100x, určite nebudeme písať pod seba 100x ten istý kód, ale vložíme ho do cyklu. Cyklov máme niekoľko druhov. Vysvetlíme si kedy ktorý použiť. Samozrejme si ukážeme praktické príklady.

Cyklus while

Cyklus while je najjednoduchším cyklom v Pythone. Cyklus jednoducho opakuje svoje príkazy, kým je jeho podmienka pravdivá - teda True. Môže dokonca obsahovať aj nepovinnú vetvu else pre prípad, že podmienka už nie je True. Syntax cyklu je nasledovná:

while (podmínka):
    # blok príkazov
else:
    # blok príkazov

Príklad Sheldon

Poďme si urobiť jednoduchý príklad. Väčšina z nás určite pozná Sheldona z The Big Bang Theory. Pre tých čo nie, budeme simulovať situáciu, keď klope na dvere svojej susedky. Vždy 3x zaklope a potom zavolá: "Penny!". Náš kód by bez cyklov vyzeral takto:

print("Knock")
print("Knock")
print("Knock")
print("Penny!")

Avšak s použitím cyklu už ďalej nemusíme kopírovať ten istý kód znova a znova:

i = 0
while(i<3):
    print("Knock")
    i+=1
print("Penny!")
Konzolová aplikácia
Knock
Knock
Knock
Penny!

Deklarovali sme pomocnú premennú i. Cyklus sa celkom trikrát opakuje. Na samotnom začiatku má i hodnotu nula, slučka potom vypíše "Knock" pri každej iterácii cyklu sa zvýši o jedna. Rovnako pokračuje s hodnotami jedna a dve. Akonáhle sa zvýši na hodnotu 3, podmienka i < 3 už ďalej nie je pravdivá a cyklus sa ukončí. Cykly majú rovnaké pravidlo odsadzovania jednotlivých riadkov príkazov rovnako ako v prípade podmienok. Teraz môžeme jednoducho zmeniť hodnotu 3 na 10 v podmienke cyklu. Príkazy sa teda vykonajú 10x bez nutnosti akéhokoľvek else. Iste vidíte, že cykly sú naozaj silný nástroj! 😉

Čísla 0 až 10

Teraz si vyskúšame premennú inkrementáciu. Vytlačíme si čísla od nuly do desiatich. Náš výstup chceme mať oddelený skôr medzerami ako jednotlivými riadkami, zvýši sa tým čitateľnosť výstupu. Preto uvedieme parameter end pre funkciu print() a nastavíme mu znak medzery:

i = 1
while (i <= 10):
    print(i, end = ' ')
    i += 1
Konzolová aplikácia
1 2 3 4 5 6 7 8 9 10

Jednotlivé znaky sa píšu medzi dvojicu apostrofov ('') miesto do úvodzoviek (""), tam patria reťazce.

Ako iste vidíte, premenná i má rôzne hodnoty po každej jednej iterácii cyklu (pojmom iterácie označujeme jeden beh cyklu). Tentokrát si všimnite, že cyklus nezačína od nuly, pretože chceme vypisovať čísla od 1 do 10. Ale myslime na to, že v programovaní bežne od nuly počítať začíname (čo uvidíme neskôr).

Sekvencie

Aby sme mohli pracovať s inými slučkami, musíme sa najskôr zoznámiť so sekvenciami. Sekvencie v Pythone sú kontajnerové dátové štruktúry, tj sú to premenné, ktoré môžu obsahovať viac položiek. S kontajnerovou štruktúrou (reťazcami) sme sa už stretli a použili. Reťazce sú sekvencie znakov.

Cyklus for

Ak chceme pracovať so všetkými prvkami v sekvencii, môžeme použiť cyklus for. Tento cyklus vždy obsahuje pevný počet opakovaní, ktorý sa rovná počtu prvkov v sekvencii. Syntax je nasledovná:

for prvek in sekvence:
    #blok príkazov
else:
    #blok príkazov

Cyklus for prejde všetky prvky v sekvencii. Iterovateľná sekvencia je napríklad reťazec, prvok potom jednotlivý znak v reťazci. V každej iterácii sa aktuálny prvok sekvencie skopíruje do premennej prvek a vykonajú sa príkazy v cykle. Vyskúšajme si to na reťazcovej sekvencii, kedy si vypíšeme každý znak na jednotlivý riadok:

slovo = "ahoj"
for znak in slovo:
   print(znak)
Konzolová aplikácia
a
h
o
j

Funkcia range()

Pravdepodobne ste si už stihli všimnúť, že syntax cyklu for je príjemnejšia ako v prípade cyklu while. Pre cyklus for môžeme použiť funkciu range(), ktorá nám vracia vygenerované čísla, napríklad vo forme rozsahu. Funkcia má tri parametre: range(začátek, konec, krok)

  1. začiatok určuje, na ktorom indexe sa začína; východisková hodnota je 0; jedná sa o nepovinný parameter;
  2. koniec určuje na ktorom indexe sa končí, ale pozor, tento index už zahrnutý nie je; v dokumentácii sa popisuje ako n-1; jedná sa o povinný parameter;
  3. krok špecifikuje spôsob inkrementácie (môžeme zvyšovať ľubovoľne: po dvoch, desiatich...); východisková hodnota je 1; jedná sa o nepovinný parameter;
Funkciu range() teda môžeme mať s jedným až troma parametrami:
  • range(n) - vráti čísla od nuly do n-1 (do n, ktoré už zahrnuté nie je)
  • range(m, n) - vráti čísla od m do n-1
  • range(m, n, i) - vráti čísla od ma každé ďalšie i-té číslo do n-1
Napríklad:
for i in range(1, 11):
    print(i, end = ' ')
Konzolová aplikácia
1 2 3 4 5 6 7 8 9 10

Teraz určite môžeme upraviť náš program so Shledonom, aby bol ešte jednoduchší, prostredníctvom cyklu for a funkcie range():

for i in range(3):
    print("Knock")
print("Penny!")
Konzolová aplikácia
Knock
Knock
Knock
Penny!
Vnorenie cyklov

Teraz si vytlačíme jednoduchú tabuľku s malou násobilkou, ktorá bude obsahovať násobky čísel od 1 do 10. Všetko čo potrebujeme urobiť je deklarovať cyklus, ktorý prejde čísla od 1 do 10, a vynásobí riadiacu premennú súčasným násobiteľom:

print("Tabulka malé násobilky:")
for i in range(1, 11):
    print(i, end = " ")
print()
for i in range(1, 11):
    print(i * 2, end = " ")
print()
for i in range(1, 11):
    print(i * 3, end = " ")
print()
for i in range(1, 11):
    print(i * 4, end = " ")
print()
for i in range(1, 11):
    print(i * 5, end = " ")
print()
for i in range(1, 11):
    print(i * 6, end = " ")
print()
for i in range(1, 11):
    print(i * 7, end = " ")
print()
for i in range(1, 11):
    print(i * 8, end = " ")
print()
for i in range(1, 11):
    print(i * 9, end = " ")
print()
for i in range(1, 11):
    print(i * 10, end = " ")
Konzolová aplikácia
Tabulka malé násobilky:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100

Za pozornosť stojí prázdna funkcia print(), ktorá tu plní funkciu odriadkovania na konci každého riadku. Program funguje skvele, ale ako vidíte, napísali som zbytočne veľa kódu. Úprimne povedané, mohli by sme to zjednodušiť, pretože všetko čo program robí, je len opakovať desaťkrát a zároveň navyšovať násobiteľ.

Riešením je vnoriť jeden cyklus do druhého, aby jeden cyklus udával násobiteľ, a druhý cyklus násobiteľ vynásobil od 1 do 10.

print("Tabuľka malé násobilky:")
for j in range(1, 11):
    for i in range(1, 11):
        print(i * j, end = " ")
    print()

To už je poriadny rozdiel v rozsahu napísaného kódu, nemyslíte? 🙂 Samozrejme nemôžeme v oboch cykloch použiť ako riadiacu premennú i, pretože by došlo k re-deklarácii premennej. Premenná j pre vonkajší cyklus beží v rozsahu 1 až 10. Počas iterácie vonkajšieho sa ale vykoná vnútorný cyklus. Ďalšia iterácia vonkajšieho potom pokračuje, akonáhle vnútorný cyklus skončí. A ako už dobre vieme, vnútorný cyklus zapisuje násobky vynásobené hodnotou j. Na konci každého vnútorného cyklu potom dôjde ešte k odriadkovaniu zavolaním prázdnej funkcie print().

Môžete skúsiť zarovnať vytlačené riadky pomocou metódy ljust() tak, aby sa čísla tlačili pekne v stĺpcoch.

Poďme si vytvoriť ešte jeden program, kde si precvičíme prácu s vonkajšou riadiacou premennou. Aplikácia bude vedieť vypočítať ľubovoľnú mocninu ľubovoľného čísla. Samozrejme by sme mohli použiť operátor pre mocniny **, ale pre úplnosť si výpočet vykonáme sami:

print("Mocninátor")
print("==========")
a = int(input("Zadajte základ mocniny:"))
n = int(input("Zadajte exponent:"))
result = a
for i in range(n - 1):
    result = result * a

print("Výsledok:%d" % (result))
print("Ďakujem za použitie mocninátora")

Asi všetci tušíme, ako funguje mocnina. Pre istotu pripomeniem, že napríklad 2 3 = 2 * 2 * 2. Teda a n spočítame tak, že n-1 krát vynásobíme číslo a číslom a. Výsledok si samozrejme musíme ukladať do premennej. Spočiatku bude mať hodnotu a ale postupne sa bude v cykle prenásobovať. Ak ste to nestihli, máme tu samozrejme článok s algoritmom výpočtu ľubovoľnej mocniny. Vidíme, že naša premenná vysledek je v tele cyklu normálne prístupná. Pokiaľ si však nejakú premennú založíme v tele cyklu, po skončení cyklu zanikne a už nebude prístupná.

Konzolová aplikácia
Mocninátor
==========
Zadejte základ mocniny: 2
Zadejte exponent: 8
Výsledek: 256
Děkuji za použití mocninátoru

Už tušíme, na čo sa for cyklus využíva. Zapamätajme si, že počet je opakovanie pevne daný.

Vylepšenie našej kalkulačky

Vezmeme si našu kalkulačku z minulých lekcií a opäť ju trochu vylepšíme, konkrétne o možnosť zadať viac príkladov. Program teda hneď neskončí, ale spýta sa používateľa, či si praje spočítať ďalší príklad. Nižšie je uvedený kód súčasnej kalkulačky:

print("Vítejte v kalkulačce")
a = float(input("Zadajte prvé číslo:"))
b = float(input("Zadajte druhé číslo:"))
print("Vyberte jednu z požadovaných operácií:")
print("1 - sčítanie")
print("2 - odčítanie")
print("3 - násobenie")
print("4 - delenie")
operace = int(input(""))

if (operace == 1):
    vysledek = a + b
elif (operace == 2):
    vysledek = a - b
elif (operace == 3):
    vysledek = a * b
elif (operace == 4):
    vysledek = a / b
if operace > 0 and operace < 5:
    print("výsledok:%f" % (vysledek))
else:
    print("Chybná voľba")
print("Ďakujem za použitie kalkulačky!")

Teraz vložíme takmer celý kód do while cyklu. Našou podmienkou bude, že používateľ zadá "áno". Budeme teda kontrolovať obsah premennej pokracovat. Spočiatku bude táto premenná nastavená na "áno", aby sa program vôbec spustil, potom do nej necháme načítať voľbu užívateľa:

print("Vitajte v kalkulačke")
pokracovat= "ano"
while (pokracovat== "áno"):
    a = float(input("Zadajte prvé číslo:"))
    b = float(input(&quot;Zadajte druhé číslo:"))
    print("Vyberte jednu z požadovaných operací:")
    print("1 - sčítanie")
    print("2 - odčítanie")
    print("3 - násobenie")
    print("4 - delenie")
    operace = int(input(""))

    if (operace == 1):
        vysledek = a + b
    elif (operace == 2):
        vysledek = a - b
    elif (operace == 3):
        vysledek = a * b
    elif (operace == 4):
        vysledek = a / b
    if operace > 0 and operace < 5:
        print("výsledok:%f" % (vysledek))
    else:
        print("Chybná voľba")
    pokracovat= input("Prajete si zadať ďalší príklad? [áno/nie]")
print("Ďakujem za použitie kalkulačky!")
Konzolová aplikácia
Vítejte v kalkulačce
Zadejte první číslo:
12
Zadejte druhé číslo:
128
Zvolte si operaci:
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
1
Výsledek: 140
Přejete si zadat další příklad? [ano/ne]
ano
Zadejte první číslo:
-10,5
Zadejte druhé číslo:

Našu aplikáciu je možné teraz používať viackrát a je už takmer hotová. Už toho vieme celkom dosť, začína to byť zábava, však? 🙂

Poznámka: Toto je jeden z mála kódov, ktoré nemožno spustiť online, pretože náš robotický kompilátor by musel opakovať vstupy.

Kód je priložený na stiahnutie opäť na konci lekcie.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 261x (3.22 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

 

Predchádzajúci článok
Zoznamy v Pythone, ich základné funkcie a metódy
Všetky články v sekcii
Základné konštrukcie jazyka Python
Preskočiť článok
(neodporúčame)
Textové reťazce v Pythone
Článok pre vás napísal Vašek Doškář
Avatar
Užívateľské hodnotenie:
3 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