Martin Svoboda

Martin Svoboda - Blog

Cykly 3: for


Cyklus for je v Pythonu základní řídicí struktura, která nám umožňuje iterovat přes různé datové struktury, jako jsou seznamy, řetězce nebo jiné iterovatelné objekty. Díky němu můžeme snadno opakovat úlohy nad každým prvkem sekvence.

Základní syntaxe cyklu for vypadá takto:

for položka in sekvence:
    # opakující se kód

Tento cyklus jednoduše říká: “Pro každou položku v sekvenci proveď tento blok kódu.” Blok kódu se provádí jednou pro každý prvek v dané sekvenci.

range()

Nějprve potřebujeme nějakou sekvenci. Pokud jde o číselnou sekvenci, tak se nejčastěji používá funkce range(), v češtině rozsah. Funkce může mít až tři argumenty:

  • start – počáteční hodnota (výchozí je 0).
  • stop – konečná hodnota (tato hodnota není zahrnuta).
  • step – krok, kterým se sekvence navyšuje (výchozí je 1).

Pokud obsahuje jeden parametr, tak vygeneruje posloupnost čísel od 0 až po zadané číslo (ale bez něj).

# Range - příklad 1
# range (stop)
# stop - konečná hodnota

a = range(5)
print(a) # range(0, 5)
print(type(a)) # <class 'range'>
print(a[0]) # 0
print(a[1]) # 1
print(a[-1]) # 4
print(list(a)) # [0, 1, 2, 3, 4]

V příkladu range(5) obsahuje 0,1,2,3,4, celkem 5 číslic. Pokud dáš print(a), tak zjistíš, že range(5) je stejné jako range(0,5). Totiž, když použiješ dva argumenty, tak první argument je počátek. Když si vypíše type, tak uvidíš, že jde o speciální objekt, tak jako int, float, str, a další. Můžeš s ním zacházet tak jako s řetězci a použít hranaté závorky a index. Nebo můžeš použít funkci list a zobrazit rozsah jako seznam (ale o těch si budeme povídat jindy). Třetí argument je krok, pokud je nevyužit, tak čísla jsou po jedné, ale můžeš krok nastavit na libovolný (kromě 0), klidně i záporný.

# Range - příklady 2 a 3

# range(start, stop, step)
# start - počáteční hodnota
# stop - konečná hodnota
# step - krok

# příklad 2
a = range(-5, 5)
print(list(a))

# příklad 3
a = range(5,0,-2)
print(list(a))

for + range() = ❤️

Když umíme získat sekvenci čísel, tak pojďmě zkusit cyklus for:

# Příklad 1 - jednoduchý rozsah
for i in range(5):
    print(i)

Tento kód vypíše hodnoty 0 až 4, protože range(5) generuje posloupnost čísel od 0 do 4.

Zkusme vypsat násobky 3:

# Příklad 2 - násobky 3
for i in range(0, 100, 3):
    print(i)

Stejný výsledek bychom mohli dostat i takto:

# Příklad 2 - násobky 3
for i in range(33):
    print(i * 3)

Tento kód vypíše všechny násobky čísla 3 od 0 do 99. Pokud změníš hodnotu iterátoru v cyklu, tak to nijak neovlivní cyklus jako takový. Např.

for i in range(33):
    i *= 3
    print(i)

V každém cyklu jakobychom přepsali hodnotu i, ale ve skutečnosti jsme jen vytvořili novou proměnnou i, která existuje pouze pro daný cyklus. Proměná i mimo cyklus (tak která ja za příkazem for) zůstává nezměněná. Jde tedy o dvě různé proměnné se stejným názvem. Důkaz je jednoduchý:

for i in range(33):
    print(id(i)) # paměťová adresa proměnné
    i *= 3
    print(id(i)) # paměťová adresa proměnné
    print(i)

Kromě první iterace, kdy je i rovno 0, tak se paměťová adresa prvního i a druhého i liší. To znamená, že se jedná o dvě různé proměnné. Pro první iteraci (kdy je i rovno 0) se paměťová adresa nemění, protože obě proměnné mají stejnou hodnotu a Python šetří pamětí.

Iterace přes Řetězce

Řetězce jsou v Pythonu také iterovatelné objekty. To znamená, že můžeme pomocí cyklu for procházet jednotlivé znaky v řetězci.

# Příklad 3 - iterace přes řetězec
retezec = "Ahoj, světe!"
for znak in retezec:
    print(znak)

Tento příklad vypíše každý znak řetězce “Ahoj, světe!” na samostatném řádku.

Použití

Nyní můžeme cyklus for využít pro různé matematické operace, například pro výpočet součtu všech čísel v určitém rozsahu.

# Příklad 4 - součet čísel
soucet = 0
for cislo in range(1, 1001):
    soucet += cislo

print(f"Součet čísel od 1 do 1000 je {soucet}.")

Tento kód vypočítá a vypíše součet všech čísel od 1 do 1000.

Nebo můžeme spočítat kolik je samohlásek

# Příklad 5 - počet samohlásek
retezec = "Python je skvělý programovací jazyk"
samohlasky = "aeiouyáéíóúýůě"
pocet_samohlasek = 0
poce_souhlasek = 0

for znak in retezec.lower():
    if znak in samohlasky: # pokud je znak v samohláskách
        pocet_samohlasek += 1
    elif znak.isalpha(): # pokud je znak písmeno
        poce_souhlasek += 1

print(f"Počet samohlásek: {pocet_samohlasek}")
print(f"Počet souhlásek: {poce_souhlasek}")

Shrnutí

Několik věcí, které je dobré si zapamatovat:

  • Název proměnné může být jakýkoli, ale běžně se používají jednotné názvy jako item, element, atd.
  • Posloupností může být jakýkoli iterovatelný objekt, řetězec atd.
  • Blok kódu se provede jednou pro každý prvek sekvence.
  • Jakékoli změny provedené v samotném prvku uvnitř smyčky nemají na sekvenci vliv.
  • Smyčka for se zastaví, jakmile dosáhne konce posloupnosti.

Cykly for jsou ideální, když potřebuješ něco provést určitý početkrát.

Kontrolní Otázky

Zkus odpovědět na následující otázky:

  1. Co je to cyklus for v jazyce Python a kdy se používá?
  2. Jaký je rozdíl mezi cyklem for a cyklem while?
  3. Co vše může být posloupností v cyklu for?
  4. Jak se používá funkce range() v Pythonu?
  5. Jak by vypadal kód, který sčítá všechna čísla od 1 do 1000?

Kvízy

Kvíz:

Jaký bude výstup následujícího kódu?

for i in range(5):
    print(i)
  1. 0 1 2 3 4 5
  2. 0 1 2 3 4
  3. 1 2 3 4 5
  4. Chybové hlášení
Kvíz:

K čemu slouží v jazyce Python funkce range()?

  1. Vytvoří seznam čísel od 0 do zadaného čísla.
  2. Vygeneruje posloupnost čísel od 0 do zadaného čísla, ale bez něj.
  3. Vygeneruje posloupnost čísel od 1 do zadaného čísla.
  4. Generuje náhodné číslo.
Kvíz:

Která z následujících možností je nekonečná smyčka?

  1. for i in range(5):
  2. for i in range(0):
  3. while True:
  4. while False:
Kvíz:

Co vypíše následující kód?

for písmeno in "Hello":
    print(písmeno)
  1. Hello
  2. H e l l o
  3. H
    e
    l
    l
    o
  4. Chybová zpráva

Cvičení

  1. Napište cyklus for, který vypíše čísla od 1 do 10.
  2. Napište smyčku for, která vypíše 2. mocninu čísel 1 až 10 (tj. 1, 4, 9, 16, …, 100).
  3. Napište cyklus for, který iteruje řetězec a vypisuje jednotlivé znaky.
  4. Napište cyklus for, který spočítá počet samohlásek v řetězci.
  5. Napište program, který pomocí smyčky for vypíše tabulku násobků čísla zadaného uživatelem.
  6. Napište program, který pomocí smyčky for vypočítá faktoriál čísla.
  7. Napište program, který používá cyklus for k obrácení řetězce (vypíše ho pozpátku).