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:
- Co je to cyklus
for
v jazyce Python a kdy se používá? - Jaký je rozdíl mezi cyklem
for
a cyklemwhile
? - Co vše může být posloupností v cyklu
for
? - Jak se používá funkce
range()
v Pythonu? - Jak by vypadal kód, který sčítá všechna čísla od 1 do 1000?
Kvízy
Jaký bude výstup následujícího kódu?
for i in range(5):
print(i)
- 0 1 2 3 4 5
- 0 1 2 3 4
- 1 2 3 4 5
- Chybové hlášení
K čemu slouží v jazyce Python funkce range()
?
- Vytvoří seznam čísel od 0 do zadaného čísla.
- Vygeneruje posloupnost čísel od 0 do zadaného čísla, ale bez něj.
- Vygeneruje posloupnost čísel od 1 do zadaného čísla.
- Generuje náhodné číslo.
Která z následujících možností je nekonečná smyčka?
- for i in range(5):
- for i in range(0):
- while True:
- while False:
Co vypíše následující kód?
for písmeno in "Hello":
print(písmeno)
-
Hello
-
H e l l o
-
H e l l o
-
Chybová zpráva
Cvičení
- Napište cyklus
for
, který vypíše čísla od 1 do 10. - Napište smyčku
for
, která vypíše 2. mocninu čísel 1 až 10 (tj. 1, 4, 9, 16, …, 100). - Napište cyklus
for
, který iteruje řetězec a vypisuje jednotlivé znaky. - Napište cyklus
for
, který spočítá počet samohlásek v řetězci. - Napište program, který pomocí smyčky
for
vypíše tabulku násobků čísla zadaného uživatelem. - Napište program, který pomocí smyčky
for
vypočítá faktoriál čísla. - Napište program, který používá cyklus
for
k obrácení řetězce (vypíše ho pozpátku).