def, parametry, argumenty, return, výchozí hodnoty, rozsah platnosti, docstringutok(), vyprava(), zobraz_hrdinu()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ě.
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áš.
Tohle je koncepčně nejtěžší část hodiny. Podívej se na obě verze vedle sebe:
st.writeje jako říct výsledek nahlas — zazní a je pryč.returnje 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.
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í.
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.
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.
Text v trojitých uvozovkách hned pod
defje popis funkce. VS Code ti ho ukáže, když na funkci najedeš myší. Piš je česky, pro sebe.
Tři jasná pravidla:
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ě.
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.
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.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.def bez typů odpovídá metodě, výchozí hodnoty fungují
stejně jako optional parameters, return a, b je jako vrácení tuple.| 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() |
Zadání:
- Napiš funkci
pozdrav(jmeno), která vrátí uvítací větu- Zavolej ji s textem z
st.text_inputa výsledek zobraz- Přidej druhý parametr
povolanis výchozí hodnotou „poutník"- Napiš funkci
sila_utoku(sila, zbran_bonus), která vrátí součet- 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.
Zadání:
- Napiš funkci
poskozeni(sila, hod, obrana)vracející výsledné poškození- Poškození nesmí být záporné — použij
max(0, ...)- Přidej nepovinný parametr
kriticky=False, který poškození zdvojnásobí- Zavolej funkci se čtyřmi různými kombinacemi a všechny výsledky vypiš
- 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.
Zadání:
- Napiš
stav_hrdiny(zivoty)vracející text podle počtu životů- Napiš
cena_inventare(inventar, cenik)vracející celkovou cenu- Napiš
nejsilnejsi(prisery)vracející slovník nejsilnější příšery- Napiš
muze_do_veze(inventar, zivoty)vracejícíTrueneboFalse- 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.
Zadání:
- Napiš funkci
karta(jmeno, zivoty, sila, emoji), která vykreslí kartu postavy- Použij v ní
st.subheader,st.columns,st.metricast.progress- Zavolej funkci cyklem pro celou družinu ze seznamu slovníků
- Přidej nepovinný parametr
max_hp=100a použij ho v progress baru- 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.
Zadání:
- Vytáhni vykreslení hrdiny do funkce
zobraz_hrdinu(h)- Vytáhni výpravu do funkce
vyprava(h, data)vracející text zápisu- Vytáhni nákup do funkce
kup(h, zbozi, cena)vracejícíTrue/False- Přidej funkci
zapis(text), která přidá řádek do deníku- 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í.
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.
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 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 |
| 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í |