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)
- začiatok určuje, na ktorom indexe sa začína; východisková hodnota je 0; jedná sa o nepovinný parameter;
- 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;
- 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;
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
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("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