← Přehled všech hodin

Funkce — úklid v kódu

Cíl hodiny: Děti umí vytáhnout opakovaný kus kódu do funkce, předat mu údaje a dostat výsledek zpět.
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: kód, který se opakuje1. Část pro učitele

Podívej se na tenhle případ:

Vidíš, jak je to skoro stejné? Liší se jen čísla. A když budeš chtít změnit způsob počítání, musíš to opravit na všech místech. A někde na to zapomeneš. To se stane vždycky.

Funkce je pojmenovaný recept. Napíšeš ho jednou a používáš kdykoliv. Když ho potřebuješ opravit, opravíš ho na jednom místě.

Blok 2Anatomie funkce1. Část pro učitele

Pojmenujte části přesně a držte se toho celý rok:

Část Co to je
def klíčové slovo „definuji funkci"
pozdrav název, který si vymyslíš
jmeno parametr — proměnná uvnitř funkce
"Arkon" argument — konkrétní hodnota při volání
return co funkce vrátí zpět

Definice funkci jen popíše. Nic se nestane, dokud ji nezavoláš. Je to jako recept v kuchařce — dokud podle něj nevaříš, žádné jídlo nemáš.

Blok 3return versus print/st.write1. Část pro učitele

Tohle je koncepčně nejtěžší část hodiny. Podívej se na obě verze vedle sebe:

st.write je jako říct výsledek nahlas — zazní a je pryč. return je jako podat ho v ruce — můžeš s ním pokračovat.

Když funkce nemá return, vrací None. To je „nic".

Pravidlo: funkce, která něco počítá, má vždycky return.

Blok 4Několik parametrů a výchozí hodnoty1. Část pro učitele

Parametr s = je nepovinný. Když ho nepředáš, použije se výchozí hodnota. Pojmenované argumenty jsou čitelnější — hlavně když je jich hodně.

Pravidlo: parametry s výchozí hodnotou musí být až za těmi bez ní.

Blok 5return několika hodnot1. Část pro učitele
def souboj(hrdina_hp, prisera_hp):
    ...
    return hrdina_hp, prisera_hp, kolo

h, p, kolo = souboj(100, 80)

Python umí vrátit víc věcí najednou — oddělíš je čárkou. Při přebírání je zase rozbalíš do tří proměnných.

Blok 6Rozsah platnosti (scope)1. Část pro učitele
def neco():
    x = 5          # x existuje JEN uvnitř funkce
    st.write(x)

neco()
st.write(x)        # NameError: name 'x' is not defined

Proměnná vytvořená ve funkci uvnitř funkce zůstane. Venku o ní nikdo neví. Je to dobře — funkce ti nerozhází zbytek programu.

Naopak číst zvenku jde:

Konstanty psané VELKÝMI písmeny je běžné číst přímo. Ale hodnoty, které se mění, si funkci raději předej jako parametr.

Blok 7Docstring — popis funkce1. Část pro učitele

Text v trojitých uvozovkách hned pod def je popis funkce. VS Code ti ho ukáže, když na funkci najedeš myší. Piš je česky, pro sebe.

Blok 8Jak poznat, že je čas na funkci1. Část pro učitele

Tři jasná pravidla:

  1. Píšu to samé podruhé → funkce
  2. Ten blok kódu jde pojmenovat jednou větou → funkce
  3. Kód je delší než obrazovka → rozdělit na funkce

Dobrá funkce dělá jednu věc a její název to říká. Když musíš do názvu dát „a" (spocitej_a_vypis), jsou to nejspíš funkce dvě.

Blok 9Funkce a Streamlit1. Část pro učitele

Funkce může obsahovat Streamlit prvky — to je velmi užitečné:

def zobraz_hrdinu(h):
    st.subheader(f"🧙 {h['jmeno']}")
    a, b = st.columns(2)
    a.metric("Životy", h["zivoty"])
    b.metric("Zlato", h["zlato"])

zobraz_hrdinu(st.session_state.hrdina)

Takhle si uděláš vlastní „komponentu". Zavoláš ji kdekoliv a vypadá to všude stejně.

Pozor na widgety uvnitř funkce volané víckrát → DuplicateWidgetID. Řešení: parametr key.

Poznámky pro učiteleTechnické pozadí pro učitele1. Část pro učitele
  • Python předává argumenty odkazem na objekt. U neměnných typů (int, str) se tedy změna uvnitř neprojeví venku, u list a dict ano. Tohle děti překvapí a je dobré to jednou ukázat.
  • Nikdy nepoužívejte měnitelný objekt jako výchozí hodnotu (def f(x=[])) — vytvoří se jen jednou a sdílí se mezi voláními. Klasická past.
  • global existuje, ale ve výuce ho nepoužívejte. Vede k nepřehlednému kódu. Místo toho: předat parametrem, vrátit return.
  • Analogie pro C#: def bez typů odpovídá metodě, výchozí hodnoty fungují stejně jako optional parameters, return a, b je jako vrácení tuple.
Poznámky pro učiteleČasté chyby1. Část pro učitele
Chyba Příčina Řešení
Funkce vrací None Chybí return Doplnit return
NameError u proměnné z funkce Lokální rozsah Vrátit přes return
TypeError: missing 1 required argument Málo argumentů Doplnit nebo dát výchozí hodnotu
Funkce se neprovede Jen definovaná, nezavolaná Přidat funkce()
DuplicateWidgetID Widget ve funkci volané 2× Přidat parametr key
Změna seznamu se projeví venku Seznam je odkaz Předat seznam.copy()

2. Ukázky pro projekci

Blok 10Ukázka 1 — Před a po zavedení funkce2. Ukázky pro projekci
demo/demo1_proc_funkce.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 2 — return versus st.write2. Ukázky pro projekci
demo/demo2_return.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 12Ukázka 3 — Vlastní komponenty ze Streamlitu2. Ukázky pro projekci
demo/demo3_komponenty.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 13Cvičení 1 — První funkce (15 min)3. Cvičení na hodinu

Zadání:

  1. Napiš funkci pozdrav(jmeno), která vrátí uvítací větu
  2. Zavolej ji s textem z st.text_input a výsledek zobraz
  3. Přidej druhý parametr povolani s výchozí hodnotou „poutník"
  4. Napiš funkci sila_utoku(sila, zbran_bonus), která vrátí součet
  5. Ukaž, co se stane, když funkce nemá return — vypiš návratovou hodnotu
Úroveň Co má zvládnout
Minimum Body 1–2
Rozšíření Body 3–4
Výzva Bod 5 + napsat funkci vracející dvě hodnoty

Očekávaný výsledek: funkce se volají s různými argumenty a vracejí výsledky.

cviceni/cviceni1_prvni_funkce.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_prvni_funkce.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í 2 — Kalkulačka poškození (20 min)3. Cvičení na hodinu

Zadání:

  1. Napiš funkci poskozeni(sila, hod, obrana) vracející výsledné poškození
  2. Poškození nesmí být záporné — použij max(0, ...)
  3. Přidej nepovinný parametr kriticky=False, který poškození zdvojnásobí
  4. Zavolej funkci se čtyřmi různými kombinacemi a všechny výsledky vypiš
  5. Přidej funkci popis_zasahu(poskozeni), která vrátí slovní hodnocení
Úroveň Co má zvládnout
Minimum Body 1–2
Rozšíření Body 3–4
Výzva Bod 5 + spojit obě funkce dohromady

Očekávaný výsledek: tabulka útoků s hodnocením.

cviceni/cviceni2_kalkulacka.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_kalkulacka.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í 3 — Knihovna funkcí pro hru (20 min)3. Cvičení na hodinu

Zadání:

  1. Napiš stav_hrdiny(zivoty) vracející text podle počtu životů
  2. Napiš cena_inventare(inventar, cenik) vracející celkovou cenu
  3. Napiš nejsilnejsi(prisery) vracející slovník nejsilnější příšery
  4. Napiš muze_do_veze(inventar, zivoty) vracející True nebo False
  5. Všechny čtyři funkce vyzkoušej s ovládacími prvky
Úroveň Co má zvládnout
Minimum Body 1–2
Rozšíření Body 3–4
Výzva Bod 5 + přidat docstring ke každé funkci

Očekávaný výsledek: čtyři samostatné funkce, každá dělá jednu věc.

cviceni/cviceni3_knihovna.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_knihovna.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í 4 — Vlastní komponenta karty (20 min)3. Cvičení na hodinu

Zadání:

  1. Napiš funkci karta(jmeno, zivoty, sila, emoji), která vykreslí kartu postavy
  2. Použij v ní st.subheader, st.columns, st.metric a st.progress
  3. Zavolej funkci cyklem pro celou družinu ze seznamu slovníků
  4. Přidej nepovinný parametr max_hp=100 a použij ho v progress baru
  5. Přidej barevný rámeček, jehož barva závisí na počtu životů
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 s HTML a unsafe_allow_html=True

Očekávaný výsledek: tři stejně vypadající karty vygenerované jedním kódem.

cviceni/cviceni4_komponenta.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_komponenta.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 17Cvičení 5 — PyQuest: úklid do funkcí (25 min)3. Cvičení na hodinu

Zadání:

  1. Vytáhni vykreslení hrdiny do funkce zobraz_hrdinu(h)
  2. Vytáhni výpravu do funkce vyprava(h, data) vracející text zápisu
  3. Vytáhni nákup do funkce kup(h, zbozi, cena) vracející True/False
  4. Přidej funkci zapis(text), která přidá řádek do deníku
  5. Zkontroluj, že hlavní část programu je krátká a čitelná
Úroveň Co má zvládnout
Minimum Body 1–2
Rozšíření Body 3–4
Výzva Bod 5 + ke každé funkci docstring

Očekávaný výsledek: stejná hra, ale hlavní kód je poloviční.

cviceni/cviceni5_pyquest_funkce.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_funkce.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 18Domácí úkol na příští hodinu4. Domácí úkol

Napiš funkci souboj(hrdina_hp, hrdina_utok, prisera_hp, prisera_utok), která odsimuluje celý souboj cyklem a vrátí tři hodnoty: kdo vyhrál, kolik kol to trvalo a kolik životů zbylo vítězi. Funkce nesmí nic vypisovat — jen počítat a vracet.

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_ukol10.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 19Oficiální dokumentace4. Domácí úkol

Oficiální dokumentace se hodí, když si chceš ověřit přesný zápis funkce, práci s parametry nebo to, co přesně dělá return. Je v angličtině, ale názvy kapitol i krátké příklady bývají velmi srozumitelné.

Co jsme použili Oficiální dokumentace Co tam najdeš
definice funkcí def Function definitions přesný zápis funkce, parametry a tělo funkce
volání funkce Calls jak Python předává argumenty do funkce
return The return statement vracení výsledku z funkce
výchozí hodnoty parametrů Default Argument Values jak fungují nepovinné parametry
pojmenované argumenty Keyword Arguments zápis jako kriticky=True
docstring Documentation Strings popis funkce v trojitých uvozovkách
scope proměnných Python Scopes and Namespaces proč lokální proměnná neexistuje mimo funkci
None The None object co znamená návratová hodnota None

5. Umíme informatiku

Blok 20Navazující cvičení na Umíme informatiku5. Umíme informatiku
Cvičení Odkaz Proč se hodí
Robotanik umimeinformatiku.cz Podprogramy a jejich volání
Python želva umimeinformatiku.cz Vlastní funkce na kreslení
Algoritmické myšlení umimeinformatiku.cz Rozklad problému
Programování v Pythonu umimeinformatiku.cz Definice funkcí