for a kdy while.
Podívej se na tenhle kód a zkus odhadnout, co ti na něm bude vadit:
Co když má hrdina dvacet věcí? A co když neví, kolik jich má? Tenhle kód se rozbije, jakmile se seznam změní.
Čte se to česky: „pro každou věc v inventáři udělej…" Nezajímá tě, kolik jich je. Python to zvládne pro tři i pro tři sta.
Co se tady přesně děje:
vecje proměnná, kterou si vymýšlíš ty. Python do ní postupně dá první věc, pak druhou, pak třetí. Tělo cyklu se provede tolikrát, kolik je v seznamu položek.
Odsazení funguje stejně jako u if. To, co je odsazené, se opakuje.
for i in range(5): # 0, 1, 2, 3, 4
for i in range(1, 6): # 1, 2, 3, 4, 5
for i in range(0, 10, 2): # 0, 2, 4, 6, 8
for i in range(5, 0, -1): # 5, 4, 3, 2, 1
range(5)znamená „pětkrát", ale čísla jdou od nuly do čtyřky. Zase to samé pravidlo: konec se nezapočítává.
Praktické použití:
enumerateti dá dvojici: pořadí a hodnotu.start=1je užitečné, když chceš číslovat lidsky od jedničky.
Tenhle vzor použiješ v každém dalším programu:
Nejčastější chyba: nastavit
celkem = 0uvnitř cyklu. Pak se ti to při každém průchodu vynuluje a vyjde jen poslední hodnota.
Stejný vzor funguje pro počítání, hledání maxima i skládání textu:
forpoužij, když víš, kolikrát.whilepoužij, když nevíš — víš jenom, kdy se má přestat.
Kritické varování:
while zivoty > 0:
st.write("bojuji") # ŽIVOTY SE NIKDY NEZMĚNÍ = nekonečný cyklus!
Uvnitř
whilemusí být něco, co podmínku jednou poruší. Jinak se program zasekne. Ve Streamlitu ti zamrzne celá stránka.
Bezpečnostní pojistka, kterou se vyplatí používat:
breakznamená „končím, jdu pryč".continueznamená „tuhle přeskočím, ale pokračuju dál".
Vnitřní cyklus proběhne celý pro každý průchod vnějšího. Když má vnější 3 a vnitřní 4 položky, výsledků je dvanáct.
Zkus to na turnajovou tabulku — je to přehledné a zábavné.
Důležitá poznámka pro učitele:
Cyklus proběhne celý během jednoho běhu skriptu. Nemůžeš tedy udělat souboj po kolech tak, že bys mezi koly čekal na kliknutí. Buď simuluješ celý souboj naráz cyklem, nebo jedno kolo za jedno kliknutí pomocí
session_state. Obojí je správně, jen pro jiný účel.
for(i=0; i<n; i++). for je vždycky „foreach"
nad iterovatelným objektem. range je líný generátor, ne seznam.for ... else existuje: else se provede, když cyklus neskončil breakem.
Do výuky to nepatří, ale hodí se vám při hledání.[x*2 for x in a]) ukazujte až pokročilým a až po tom,
co bezpečně umí obyčejný for.for x in seznam[:]:| Chyba | Příčina | Řešení |
|---|---|---|
| Vyjde jen poslední hodnota | Akumulátor uvnitř cyklu | Nastavit před cyklem |
| Stránka zamrzne | Nekonečný while |
Změna podmínky uvnitř + limit |
IndentationError |
Chybí odsazení těla | 4 mezery |
range(1,5) dá jen 4 čísla |
Konec se nezapočítává | range(1, 6) |
TypeError: 'int' is not iterable |
for x in 5 |
for x in range(5) |
| Divné výsledky při mazání | Mazání během cyklu | Iterovat přes seznam[:] |
Zadání:
- Vytvoř seznam aspoň šesti předmětů
- Vypiš ho cyklem
for, každý na svém řádku- Přidej číslování pomocí
enumerate(seznam, start=1)- Spočítej v cyklu, kolik předmětů má v názvu písmeno „a"
- Vypiš jen předměty, jejichž název je delší než 4 znaky
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Bod 4 s akumulátorem |
| Výzva | Bod 5 + nejdelší název najít cyklem |
Očekávaný výsledek: očíslovaný seznam a pár spočítaných statistik.
Zadání:
- Přidej
st.sliderna počet kol dobrodružství (1 až 20)- Cyklem
for i in range(1, kola + 1)vypiš každé kolo- Odměna za kolo je
i * 10zlata — vypiš ji- Sečti celkovou odměnu akumulátorem a zobraz ji přes
st.metric- Ulož odměny do seznamu a zobraz je pomocí
st.line_chart
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Bod 4 |
| Výzva | Bod 5 + přidat bonus, když je kolo dělitelné pěti (i % 5 == 0) |
Očekávaný výsledek: rostoucí graf odměn a součet.
Zadání:
- Použij seznam slovníků s příšerami z minulé hodiny
- Cyklem vypiš všechny příšery ve formátu „Skřet — 30 HP, síla 8"
- Přidej
st.sliderna maximální sílu a vypisuj jen ty slabší- Spočítej v cyklu součet zlata za všechny zobrazené příšery
- Najdi cyklem nejsilnější příšeru a zvýrazni ji
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–2 |
| Rozšíření | Body 3–4 |
| Výzva | Bod 5 + použít continue na přeskočení příšer se zlatem pod 20 |
Očekávaný výsledek: filtr, který reaguje na posuvník.
Zadání:
- Nastav slidery na životy a útok obou soupeřů
- Napiš
while, který běží dokud oba žijí- V každém kole odečti poškození a zapiš řádek do logu
- Přidej pojistku
kolo < 100, aby cyklus nikdy nezamrzl- Po skončení vypiš, kdo vyhrál a po kolika kolech
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Body 4–5 |
| Výzva | Přidat break, když příšera padne, aby už neútočila |
Očekávaný výsledek: kompletní bojový protokol.
Zadání:
- Vypiš inventář v postranním panelu cyklem s číslováním
- Přidej tlačítko „Výprava na 3 dny" — cyklem proveď tři výpravy najednou
- V cyklu ubírej životy a přičítej zlato, každý den zapiš do deníku
- Když hrdina během výpravy padne, přeruš cyklus pomocí
break- Po výpravě vypiš souhrn: kolik dní přežil a kolik celkem získal
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–2 |
| Rozšíření | Body 3–4 |
| Výzva | Bod 5 + graf životů během výpravy přes st.line_chart |
Očekávaný výsledek: jedno kliknutí spustí několikadenní výpravu.
Napiš program, který cyklem projde bestiář a najde pro hrdinu nejvýhodnější příšeru — tu, která dá nejvíc zlata za jeden bod síly. Poměr spočítej jako
zlato / silaa nejlepší vyber cyklem.
Toto je jedna z možných variant, jak mohl úkol dopadnout. Tvoje řešení se může lišit a to je v pořádku.
Oficiální dokumentace se hodí, když si chceš ověřit přesný zápis cyklu, chování range() nebo význam příkazů jako break a continue. Je v angličtině, ale u cyklů obvykle stačí sledovat krátké příklady a názvy argumentů.
| Co jsme použili | Oficiální dokumentace | Co tam najdeš |
|---|---|---|
for |
The for statement |
přesný zápis cyklu for a pravidla jeho běhu |
while |
The while statement |
podmínkové opakování a kdy cyklus skončí |
range() |
range |
vytváření číselných posloupností |
enumerate() |
enumerate |
procházení hodnot i jejich pořadí najednou |
break |
The break statement |
okamžité ukončení cyklu |
continue |
The continue statement |
přeskočení jednoho průchodu cyklem |
len() |
len |
zjištění počtu prvků při práci s daty |
sum() |
sum |
rychlý součet hodnot pro kontrolu akumulátoru |
| Cvičení | Odkaz | Proč se hodí |
|---|---|---|
| Robotanik | umimeinformatiku.cz | Opakování příkazů |
| Želví grafika | umimeinformatiku.cz | Cykly viditelně |
| Python želva | umimeinformatiku.cz | for v Pythonu |
| Algoritmické myšlení | umimeinformatiku.cz | Opakování a ukončení |