← Přehled všech hodin

Cykly — počítač dělá opakovanou práci

Cíl hodiny: Děti umí nechat počítač projít data místo ručního opisování a chápou, kdy použít for a kdy while.
Jak stránku používat: vpravo nahoře je tlačítko Prezentace — schová všechno kromě jednoho bloku a přepíná se šipkami. U ukázek a cvičení je kód vlevo editovatelný: uprav ho a klikni na Spustit (nebo Ctrl+Enter), výsledek se objeví vpravo. Běží to přímo v prohlížeči, bez instalace.

1. Část pro učitele

Blok 1Motivace: proč se bez cyklu trápíš1. Část pro učitele

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.

Blok 2Cyklus for přes seznam1. Část pro učitele

Co se tady přesně děje:

vec je 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.

Blok 3range — cyklus s čísly1. Část pro učitele
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í:

Blok 4enumerate — když potřebuješ i pořadí1. Část pro učitele

enumerate ti dá dvojici: pořadí a hodnotu. start=1 je užitečné, když chceš číslovat lidsky od jedničky.

Blok 5Akumulátor — nejdůležitější vzor1. Část pro učitele

Tenhle vzor použiješ v každém dalším programu:

Nejčastější chyba: nastavit celkem = 0 uvnitř 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:

Blok 6while — dokud platí podmínka1. Část pro učitele

for použij, když víš, kolikrát. while použ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ř while musí 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:

Blok 7break a continue1. Část pro učitele

break znamená „končím, jdu pryč". continue znamená „tuhle přeskočím, ale pokračuju dál".

Blok 8Vnořený cyklus1. Část pro učitele

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é.

Poznámky pro učiteleCyklus a session_state ve Streamlitu1. Část pro učitele

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.

Poznámky pro učiteleTechnické pozadí pro učitele1. Část pro učitele
  • Python nemá klasický 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í.
  • Seznamové komprehence ([x*2 for x in a]) ukazujte až pokročilým a až po tom, co bezpečně umí obyčejný for.
  • Změna seznamu během jeho procházení je klasická past. Iterovat přes kopii: for x in seznam[:]:
Poznámky pro učiteleČasté chyby1. Část pro učitele
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[:]

2. Ukázky pro projekci

Blok 9Ukázka 1 — Bez cyklu a s cyklem2. Ukázky pro projekci
demo/demo1_proc_cyklus.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 10Ukázka 2 — range, enumerate a akumulátor2. Ukázky pro projekci
demo/demo2_range_akumulator.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 11Ukázka 3 — Simulace celého souboje2. Ukázky pro projekci
demo/demo3_simulace.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

3. Cvičení na hodinu

Blok 12Cvičení 1 — Výpis inventáře (15 min)3. Cvičení na hodinu

Zadání:

  1. Vytvoř seznam aspoň šesti předmětů
  2. Vypiš ho cyklem for, každý na svém řádku
  3. Přidej číslování pomocí enumerate(seznam, start=1)
  4. Spočítej v cyklu, kolik předmětů má v názvu písmeno „a"
  5. 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.

cviceni/cviceni1_vypis.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Řešení 1 — jedna z možných variant
reseni/reseni1_vypis.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 13Cvičení 2 — Tabulka násobků a odměn (20 min)3. Cvičení na hodinu

Zadání:

  1. Přidej st.slider na počet kol dobrodružství (1 až 20)
  2. Cyklem for i in range(1, kola + 1) vypiš každé kolo
  3. Odměna za kolo je i * 10 zlata — vypiš ji
  4. Sečti celkovou odměnu akumulátorem a zobraz ji přes st.metric
  5. 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.

cviceni/cviceni2_odmeny.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Řešení 2 — jedna z možných variant
reseni/reseni2_odmeny.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 14Cvičení 3 — Filtrování bestiáře (20 min)3. Cvičení na hodinu

Zadání:

  1. Použij seznam slovníků s příšerami z minulé hodiny
  2. Cyklem vypiš všechny příšery ve formátu „Skřet — 30 HP, síla 8"
  3. Přidej st.slider na maximální sílu a vypisuj jen ty slabší
  4. Spočítej v cyklu součet zlata za všechny zobrazené příšery
  5. 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.

cviceni/cviceni3_filtr.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Řešení 3 — jedna z možných variant
reseni/reseni3_filtr.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 15Cvičení 4 — Souboj cyklem while (20 min)3. Cvičení na hodinu

Zadání:

  1. Nastav slidery na životy a útok obou soupeřů
  2. Napiš while, který běží dokud oba žijí
  3. V každém kole odečti poškození a zapiš řádek do logu
  4. Přidej pojistku kolo < 100, aby cyklus nikdy nezamrzl
  5. 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.

cviceni/cviceni4_while_souboj.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Řešení 4 — jedna z možných variant
reseni/reseni4_while_souboj.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 16Cvičení 5 — PyQuest: cykly ve hře (25 min)3. Cvičení na hodinu

Zadání:

  1. Vypiš inventář v postranním panelu cyklem s číslováním
  2. Přidej tlačítko „Výprava na 3 dny" — cyklem proveď tři výpravy najednou
  3. V cyklu ubírej životy a přičítej zlato, každý den zapiš do deníku
  4. Když hrdina během výpravy padne, přeruš cyklus pomocí break
  5. 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.

cviceni/cviceni5_pyquest_cykly.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Řešení 5 — jedna z možných variant
reseni/reseni5_pyquest_cykly.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

4. Domácí úkol

Blok 17Domácí úkol na příští hodinu4. Domácí úkol

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 / sila a nejlepší vyber cyklem.

Zobrazit ukázkové řešení domácího úkolu

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.

domaci/domaci_ukol09.py
Tady se objeví výsledekKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 18Oficiální dokumentace4. Domácí úkol

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

5. Umíme informatiku

Blok 19Navazující cvičení na Umíme informatiku5. Umíme informatiku
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í