Späť na hlavnú stránku

Cyklus v Pythone

Cykly sú základným nástrojom v programovaní, ktorý nám umožňuje opakovať určitý blok kódu viackrát. Python ponúka dva hlavné typy cyklov: for a while. Cykly šetria čas a umožňujú písať efektívnejší kód.

Cyklus for (ak vieme počet opakovaní)

Cyklus for používame vtedy, keď vieme, koľkokrát sa má určitý kód vykonať, alebo keď chceme prechádzať prvky nejakej kolekcie (zoznam, reťazec, atď.).

for i in range(5):
    print(i,'Ahoj')
    print("xxxxxxxxxx")

Výstup:

0 Ahoj
xxxxxxxxxx
1 Ahoj
xxxxxxxxxx
2 Ahoj
xxxxxxxxxx
3 Ahoj
xxxxxxxxxx
4 Ahoj
xxxxxxxxxx

Všimnite si, že v cykle sa zopakujú všetky príkazy uvedené za ním, ktoré sú odsadené (4 medzery pred príkazom). Aký očakávate výstup, ak posledný príkaz na vykresľovanie krížikov zarovnáte hneď na začiatok riadka? Overte si to.

for i in range(5):
    print(i,'Ahoj')
print("xxxxxxxxxx")

Výstup:

0 Ahoj
1 Ahoj
2 Ahoj
3 Ahoj
4 Ahoj
xxxxxxxxxx

Cyklus for má vbudované automatické počítadlo (i = riadiaca premenná cyklu, programátor si ju však pomenuje ako chce). V Pythone sa vždy začína počítať od nuly, preto pri prvom prechode cyklom je i=0, po druhom je i=1, po treťom, i=2 atď. až v poslenom prechode cyklom to bude hodnota o jedna menšia ako počet opakovaní cyklu (u nás to bolo 5, preto v poslednej iterácii je vo výpise 4 Ahoj).
Ak potrebujeme riadiacu premennú nezačínať v nule, uvedieme to v parametri príkazu range:

for c in range(1,6):
    print(f'Číslo: {c}')

Výstup:

Číslo: 1
Číslo: 2
Číslo: 3
Číslo: 4
Číslo: 5
Poznámka:
Príkaz range(od,po) vždy generuje číslenú sekvenciu, postupnosť celých čísel, prvý člen sekvencie je číslo uvedené ako prvý vstup v zátvorke, t. .j začína od spodnej hranice "od" (vrátane), ďalší člen je o 1 väčšie číslo, atď. až posledný člen je číslo menšie ako horná hranica "po", tá už do postupnosti nepatrí.
Napr. range(5,9) vygeneruje 5, 6, 7, 8.

Ak pužijeme range(cislo) s jedným parametrom, generuje čísla od 0 (vrátane) až do hodnoty "číslo - 1".
Napr. range(3) vygeneruje 0, 1, 2 (t. j. ich počet vždy odpovedá číslu v zátvorke).

Ak pužijeme range(od,po,krok) s troma parametrami, generuje čísla od hodnoty "od" (vrátane) až do hodnoty "po - 1", pričom ďalšia hodnota je vždy o hodnotu "krok" väčšia.
Napr. range(2,14,3) vygeneruje 2, 5, 8, 11.

Oddeľovače pri výpise

Nasledujúce štyri programy urobia skoro to isté - vypíšu za sebou párne jednociferné čísla, len budú inak oddelené (spôsob ukončenia výpisu pomocou príkazu print sa nastavuje špecifikovaním parametra end, bez jeho uvedienia print končí znakom \n , čo je znak konca riadka - kurzor skočí na nový riadok):

for i in range(0,10,2):
    print(i,end=' ')

Výstup:

0 2 4 6 8
for i in range(5):
    print(2*i,end=',')

Výstup:

0,2,4,6,8,
for i in range(1,6):
    print(2*i-2,end='')

Výstup:

02468
for i in range(5,0,-1):
    print(2*(5-i),end='*')

Výstup:

0*2*4*6*8*

Iterácie iných štruktúr

Ak chceme prechádzať prvkami zoznamu, stačí definovať akým zoznamom má cyklus for prechádzať:

ziaci = ["Anna", "Peter", "Lucia"]
for meno in ziaci:
    print(f'Dobrý deň, {meno}!')

Výstup:

Dobrý deň, Anna!
Dobrý deň, Peter!
Dobrý deň, Lucia!

Ak chceme prechádzať písmenkami raťazca, stačí použiť cyklus for takýmto spôsobom:

for pismeno in "Ahoj":
    print(pismeno)

Výstup:

A
h
o
j

Dni v týždni

dni = ["pondelok","utorok","streda","štvrtok","piatok","sobota","nedeľa"]
poradie = 1
for d in dni:
    print(f'{poradie}.deň: {d}')
    poradie = poradie + 1

Výstup:

1.deň: pondelok
2.deň: utorok
3.deň: streda
4.deň: štvrtok
5.deň: piatok
6.deň: sobota
7.deň: nedeľa

Vnorené cykly

Vnorené cykly umožňujú vytvoriť cyklus vnútri iného cyklu. To je užitočné napríklad pri kombinovaní prvkov.

jedla = ["pizza", "hamburger", "šalát"]
napoje = ["cola", "voda", "džús"]
print("Dostupné kombinácie:")
por_cislo = 1
for jedlo in jedla:
    for napoj in napoje:
        print(f'{por_cislo}. {jedlo} + {napoj}')
        por_cislo = por_cislo + 1

Výstup:

Dostupné kombinácie:
1. pizza + cola
2. pizza + voda
3. pizza + džús
4. hamburger + cola
5. hamburger + voda
6. hamburger + džús
7. šalát + cola
8. šalát + voda
9. šalát + džús

Úlohy na vlastnú prácu

Úloha 1: Delitele čísla

Od užívateľa načítajte celé číslo. Program má vypísať všetky jeho delitele (t.j. také čísla, ktorými sa dá zadané číslo vydeliť bezo zvyšku).

Zadaj číslo: 12
Jeho delitele sú: 1, 2, 3, 4, 6, 12,

Pomôcka:
Aby d bolo deliteľom čísla n musí platiť: n % d == 0. Vypisovať deliteľa treba, len ak je táto podmienka splnená.

Bonus: Zistite, či je číslo na vstupe dokonalé, tzn. súčet jeho deliteľov (okrem jeho samého) je rovný danému číslu. Napr. 6 je dokonalé, lebo má delitele 1,2,3 a ich súčet 1+2+3=6.

Úloha 2: Kombinatorika

Máte k dispozícii množinu čísel 1, 2, 3, 4. Vypíšte všetky ich:
a) variácie druhej triedy s opakovaním,
b) variácie druhej triedy bez opakovania,
c) kombinácie druhej triedy bez opakovania.

a) 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44,
b) 12, 13, 14, 21, 23, 24, 31, 32, 34, 41, 42, 43,
c) 12, 13, 14, 23, 24, 34,

Pomôcka:
Na vypisovanie 2-ciferného čísla použite 2 vnorené cykly - prvý na prvú cifru, druhý na druhú cifru. Ak nie je dovolené opakovať cifry, stačí výpis danej možnosti ošetriť podmienkou (ak sú cifry rôzne, tak vypíš, inak nepíš nič). Pri kombináciách je druhá číslica väčšia ako prvá.

Bonus: Ako by ste zmenili program, ak by sme chceli nie dvojciferné, ale trojciferné výpisy? Viete zistiť aj ich počet? Vedeli by ste úlohy a, b, c naprogramovať aj pre množinu 1, 2,.. n, kde n zadá užívateľ?

Úloha 3: Ozdobná menovka

Od užívateľa načítajte meno a vytvorte pre neho menovku v tvare:

****************
*  ZadaneMeno  *
****************

Pomôcka:
Počet hviezdičiek v prvom a poslednom riadku závisí od dĺžky zadaného mena, v strednom riadku sú po prvej * dve medzery a aj pred poslednou hviezdičkou sú dve medzery.
Počet písmen v premennej zistíme príkazom dlzka = len(premenna).

Cyklus while (ak nevieme počet opakovaní)

Cyklus while sa vykonáva tak dlho, kým je splnená určitá podmienka. Používame ho vtedy, keď nevieme vopred, koľko iterácií bude potrebných. Pred vykonávaním príkazov v cykle while sa najprv otestuje platnosť podmienky. Ak je splnená (True), tak sa príkazy začnú vykonávať, ak nie je splnená (False), všetky tam uvedené príkazy sa preskočia a program pokračuje za cyklom while.

while podmienka:
    # príkazy v cykle, ktoré sa budú opakovať
    # nezabudnite zmeniť podmienku
    # inak sa kód bude donekonečna opakovať

Odpočítavanie

import time

# načítanie vstupu od užívateľa
sekund = int(input("Od koľkých sekúnd mám začať odpočítavať? "))

# vypisovanie
print("Odpočítavanie:")
while sekund > 0:    # cyklus sa bude vykonávať dokým bude splnená podmienka sekund>0
    print(f'{sekund}...')
    time.sleep(1)          # počká sekundu
    sekund = sekund - 1    # zmení obsah premennej

# cyklus skončí ak v premennej sekund je už 0
print("Čas vypršal!")

Výstup:

Od koľkých sekúnd mám začať odpočítavať? 4
Odpočítavanie:
4...
3...
2...
1...
Čas vypršal!

Uhádni číslo

import random
print("Zahrajme si hru. Uhádni, na aké číslo od 1 do 100 myslím.")
tajne_cislo = random.randint(1,100)
pokusov = 0
while True:
    tip = int(input("Zadaj svoj tip: "))
    pokusov = pokusov + 1
    if tip == tajne_cislo:
        print(f'Správne! Uhádol si za {pokusov} pokusov.')
        break       #ukončenie cyklu while
    elif tip < tajne_cislo:
         print("Moje číslo je väčšie.")
    else:
         print("Moje číslo je menšie.")
print("Ďakujem za hru.")
Poznámka: Cyklus while s uvedením podmienky True by sa vykonával donekonečna. Dá sa však z neho vyskočiť (ukončiť cyklus) príkazom break.

Úlohy na vlastnú prácu

Úloha 4: Párne číslo

Vytvorte program, ktorý bude od užívateľa donekonečna pýtať celé číslo. V prípade že užívate zadá párne číslo, program sa mu poďakuje. Príklad výstupu:

Zadaj číslo: 5
Zadaj číslo: 17
Zadaj číslo: 4321
Zadaj číslo: 254
Ďakujem, zadal si párne číslo.

Pomôcka:
Číslo je párne, ak po delení dvoma dá zvyšok nula, t.j.
  cislo % 2 == 0.
Číslo je nepárne, ak po delení dvoma dá zvyšok jedna, t.j.
  cislo % 2 == 1.

Overenie vedomostí

Test - Cykly v Pythone

1. Ktorý príkaz správne vytvorí cyklus, ktorý vypíše čísla od 1 do 5?

a) for i in range(5): print(i)
b) for i in range(1, 6): print(i)
c) for i in range(1, 5): print(i)
d) while i <= 5: print(i)

2. Čo urobí príkaz break v tele cyklu?

a) ukončí cyklus
b) preskočí na ďalšiu iteráciu
c) zmaže obsah riadiacej premennej
d) neurobí nič

3. Ktoré čísla sa vygenerujú pri príkaze range(3, 9, 2)?

a) 3, 4, 5, 6, 7, 8, 9
b) 3, 5, 7, 9
c) 3, 5, 7
d) 3, 4, 5, 6, 7, 8

4. Ktorý príkaz správne vypíše čísla od 10 do 1 v zostupnom poradí?

a) for i in range(10, 0, -1): print(i)
b) for i in range(10, 1, -1): print(i)
c) for i in range(1, 10, -1): print(i)
d) for i in range(10, 0): print(i)

5. Čo vypíše tento kód?
for i in range(3):
    print(i * 2)

a) 0, 2, 4
b) 2, 4, 6
c) 0, 1, 2
d) 1, 2, 3

6. Ktorý cyklus je lepší pre prechádzanie prvkov v zozname?

a) Oba sú rovnako dobré
b) Žiadny z nich
c) while
d) for

7. Čo sa stane, ak vo while cykle nezmeníme premennú v podmienke?

a) Cyklus sa vykoná iba raz
b) Nastane chyba
c) Vznikne nekonečný cyklus
d) Cyklus sa nevykoná vôbec

8. V ktorej situácii by ste použili while cyklus namiesto for cyklu?

a) Pri prechádzaní zoznamu
b) Pri vypísaní čísel od 1 do 10
c) Pri čakaní na používateľský vstup "quit"
d) Pri vytváraní tabuľky násobenia

9. Čo vypíše tento kód?

x = 1 
while x < 4: 
    print(x) 
    x = x + 2

a) 1, 3
b) 1, 3, 5
c) 1, 2, 3
d) 2, 4

10. Aký bude výsledok tohto vnoreného cyklu?

for i in range(2): 
    for j in range(3): 
        print(f"{i}-{j}")

a) Vypíše 6 riadkov
b) Vypíše 5 riadkov
c) Vypíše 2 riadky
d) Nastane chyba


Späť na hlavnú stránku