Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Cyklus

Často se nám bude stávat, že budeme muset nějaký kus kódu zopakovat pro nějaké určité hodnoty. Představme si program pro vypisování všech násobků čísla tři – s našimi dosavadními znalostmi bychom tento program napsat nemohli.

K tomu nám poslouží koncept cyklu – blok kódu, který budeme opakovat pro každou hodnotu v nějaké posloupnosti. Abychom takové posloupnosti vygenerovali, pomůže nám magické slovíčko range. To nám umožní vytvořit jakoukoli posloupnost čísel s určitým počtem hodnot. Pro příklad

  • range(5) vytvoří posloupnost čísel od 0 do 4,
  • range(1, 6) vytvoří posloupnost čísel od 1 do 5,
  • range(5, 11) vytvoří posloupnost čísel od 5 do 10,
  • a range(1, 11, 2) vytvoří posloupnost čísel od 1 do 10 s krokem 2, tedy 1, 3, 5, 7, 9.

Přes hodnoty, které nám range vytvoří, budeme iterovat, neboli opakovat, blok kódu pro každou hodnotu. Tuto hodnotu můžeme v iteraci použít jako vstup, přičemž v každé iteraci bude mít jinou hodnotu podle toho, na jaké hodnotě se zrovna nacházíme v posloupnosti. Pro násobky čísla 3 tedy můžeme napsat následující program:

for cislo in range(1, 11):
    print(3 * cislo)

Posloupnost, kterou range vytvoří, jsou čísla 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. V každé iteraci se toto číslo vynásobí trojkou a výsledek vypíšeme na výstup programu.

Můžete však namítat, že tento program jde napsat takto:

print(3 * 1)
print(3 * 2)
print(3 * 3)
print(3 * 4)
print(3 * 5)
print(3 * 6)
print(3 * 7)
print(3 * 8)
print(3 * 9)
print(3 * 10)

To samozřejmě jde, ale má to řadu nevýhod a problémů:

  • Místo dvou řádků máme řádků deset.
  • Pokud chceme změnit to, jaké násobky generujeme, musíme upravit všechny řádky, případně řádky přidat nebo odebrat.
  • Neumíme ihned vyčíst krajní hodnoty, musíme projít řádky.
  • Neumíme generovat nekonečně mnoho násobků.

Důvodů je mnohem více, proto se odteď budeme držet jednoduchého pravidla: máme-li v našem kódu něco, co se dá napsat pomocí smyčky, použijeme ji. Samozřejmě i tato poučka má své výjimky, například pro dvě volání smyčku psát nebudeme.

Cyklus “dokud”

For cyklus pro každou hodnotu v posloupnosti vykoná nějaký blok kódu. Občas se stane, že chceme opakovat blok kódu, dokud nepřestane platit nějaká podmínka. K tomu slouží while cyklus. Vypišme třeba všechny násobky tak, že nejvyšší násobek je menší než 100.

i = 1
while i * 3 < 100:
    print(i * 3)
    i += 1

Pomocí while cyklu můžeme dokonce vytvořit i nekonečný cyklus:

while True:
    print("Nekonečný cyklus")

Pokud bychom cyklus chtěli opustit, můžeme použít klíčové slovo break:

i = 1

while True:
    i += 1
    if i > 100:
        break
    print(i)

Jak s for cykly tak i s while cykly se setkáme ještě mnohem více.

Převody datových typů

Abychom mohli na vstupu brát něco jiného, než řetězce, potřebujeme využít další magická slovíčka, podle toho, jaký datový typ chceme získat. Pokud požadujeme celé číslo (integer), použijeme int(...). Takto můžeme být pozdraveni tolikrát, kolikrát chceme.

pocet_pozdravu = int(input("Kolikrát chcete pozdravit?"))

for i in range(pocet_pozdravu):
    print(f"{i + 1} Ahoj!")

Všimněme si, že do závorek u int zabalíme input společně s jeho závorkami. Můžeme si to představit tak, že se nejdříve vezme vstup pomocí input a až poté se ho Python pokusí převést na celé číslo pomocí int(). Důraz klademe na pokusí, zkuste si, co se stane, když zadáme řetězec tam, kde se očekává celé číslo.

Pro přijetí desetinného čísla (float) použijeme float(...).

Tip

Zkuste si přepsat co nejvíce úloh z minulých kapitol tak, aby nevyžadovaly pro změnu vstupu změnu samotného zdrojového kódu programu. Použijte tedy konstrukce input a int, případně float.

Úlohy

Všechna sudá

Napište program, který vypíše všechna sudá čísla od 1 do 100. Program pak upravte tak, aby vypisoval čísla lichá.

Suma čísel

Napište program, který za pomocí cyklu sečte všechna čísla od zadaného počátku do zadaného konce. Program pak upravte tak, aby vypisoval součet všech čísel od 1 do 100.

Vlajka

Napište program, který vypíše následující obrazec pro libovolnou velikost:

*
**
***
****
Obrácená vlajka

Napište program, který vypíše obrácený obrazec pro libovolnou velikost:

****
***
  **
  *
Fibonacci

Napište program, který vypíše Fibonacciho posloupnost až po nějaké maximum.