"5" + 5 skončí chybou.
str, int, float, bool, f-string, přetypováníDnešní hlavní cíl je jednoduchý: dostat děti k tomu, aby viděly, že jedno číslo nahoře v souboru může ovlivnit víc míst najednou. To je přesně chvíle, kdy proměnné přestanou být „teorie" a začnou dávat smysl.
| Fáze | Co se děje | Čas |
|---|---|---|
| Opakování | Krátké připomenutí minulé hodiny a app.py |
5 min |
| Výklad | Bloky 2–7, krátké živé ukázky a otázky | 30 min |
| Projekce | Tři ukázky v sekci 2 | 20 min |
| Cvičení | Děti pracují samy, vy obcházíte | 55 min |
| Závěr | Sdílení výsledků a domácí úkol | 5 min |
Nejdůležitější není naučit názvy typů zpaměti. Důležitější je, aby dítě chápalo čtyři věci:
= znamená ulož, ne matematické rovnítko,Proměnná je krabička se štítkem. Na štítku je jméno a uvnitř je hodnota. Když chceš obsah změnit, prostě do stejné krabičky uložíš něco nového.
Tady je důležité číst znaménko = správně.
zivoty = 100se nečte „zivoty se rovná 100", ale „do proměnnézivotyulož hodnotu 100".A řádek
zivoty = zivoty - 30znamená: „vezmi starou hodnotu, odečti 30 a výsledek zase ulož pod stejné jméno".
V matematice by zápis x = x - 30 nedával smysl. V programu je to úplně
normální, protože to není rovnice, ale návod.
zivoty = 100
zivoty = zivoty - 30
Všimni si pořadí.
Na prvním řádku se hodnota vytvoří. Na druhém řádku se vezme to, co tam už bylo, něco se s tím udělá a výsledek se uloží zpátky.
Právě proto je důležité pořadí řádků. Kdybys druhý řádek přesunul nahoru,
Python by ještě nevěděl, co zivoty je.
Počítač potřebuje vědět, jaký druh věci v proměnné je. Text se chová jinak než číslo. Číslo můžeš násobit, text můžeš spojovat. Kdyby se to nerozlišovalo, počítač by nevěděl, co přesně má udělat.
| Typ | Česky | Příklad | K čemu ve hře |
|---|---|---|---|
str |
řetězec, text | "Arkon" |
jméno, popis místnosti |
int |
celé číslo | 100 |
životy, zlato, úroveň |
float |
desetinné číslo | 1.5 |
násobitel poškození |
bool |
ano/ne | True |
má klíč, je naživu |
Každý typ se hodí na něco jiného.
Zkus si všimnout, že True není text "True". Je to zvláštní typ,
který umí jen dvě hodnoty: True a False.
Funkce type(...).__name__ ti ukáže, jak se ten typ jmenuje uvnitř Pythonu.
Nemusíš si to hned pamatovat do detailu — důležité je hlavně to,
že různé druhy hodnot existují a Python je rozlišuje.
Znaménko + není vždycky totéž. Záleží na tom, s jakým typem pracuješ.
Stejné znaménko, dvě různé práce.
U čísel
+sčítá. U textů+spojuje.Když smícháš číslo a text, Python se zastaví, protože neví, jestli má sčítat, nebo lepit.
Tohle je přesně důvod, proč datové typy řešíme už dneska. Bez nich by nešlo poznat, co vlastně po programu chceš.
Když se typy nepotkají, dá se to opravit.
int("3") vezme text "3" a udělá z něj číslo 3str(5) vezme číslo 5 a udělá z něj text "5"Tomuhle se říká přetypování. Není to trest ani magie — jen přesně řekneš, co má Python s hodnotou udělat.
Když chceš ve větě ukázat proměnné, existuje víc možností. Nejčistší bývá f-string.
Všechny tři řádky fungují, ale nejsou stejně pohodlné.
První varianta je zbytečně ukecaná. Druhá je v pohodě. Třetí bývá nejčitelnější, protože text vypadá skoro jako hotová věta.
Písmeno
fpřed uvozovkami znamená: „uvnitř budou složené závorky a do nich dosaď hodnoty".
Proto se f-string hodí skoro všude, kde chceš spojit text, čísla nebo výsledek výpočtu.
f"{zivoty * 2}"
f"{1/3:.2f}"
f"{zivoty:>5}"
F-string umí i víc než jen dosazovat.
f"{zivoty * 2}" nejdřív spočítá výraz a pak ho vloží do textuf"{1/3:.2f}" zaokrouhlí číslo na dvě desetinná místaf"{zivoty:>5}" zarovná text doprava na šířku pěti znakůTo poslední se hodí hlavně později, když chceš hezky srovnat výpisy pod sebe. Dnes si z toho stačí odnést, že f-string zvládne i počítání a formátování.
Tady začínají být proměnné opravdu užitečné. Místo ručního přepisování na pěti místech změníš jedno číslo a ostatní se dopočítá samo.
# Méně šikovné
st.write("Životy: 72 ze 100")
st.progress(0.72)
# Lepší
max_zivoty = 100
zivoty = 45
st.write(f"Životy: {zivoty} z {max_zivoty}")
st.progress(zivoty / max_zivoty)
V prvním zápisu máš stejné informace napsané víckrát.
Když chceš změnit 72 na 45, musíš si vzpomenout i na 0.72 a přepsat ho
na 0.45. To je přesně typ práce, u které člověk dělá chyby.
V druhém zápisu měníš jen základní hodnoty a zbytek se dopočítá sám. Právě tohle je jeden z hlavních důvodů, proč programátoři proměnné používají.
Tady už jedna hodnota ovlivňuje víc věcí najednou.
Zkus se podívat, kolik řádků závisí na zraneni. Nejen počet životů,
ale i progress bar a procenta zdraví.
Stejně fungují skoro všechny lepší programy: nahoře jsou základní hodnoty a pod nimi všechno, co se z nich odvodí.
Jméno proměnné by mělo co nejrychleji napovědět, co je uvnitř.
_zivoty a Zivoty jsou dvě různé proměnnézivoty, ne životyzivoty = 100 ✅
zivoty_hrace = 100 ✅
2zivoty = 100 ❌
zivoty hrace = 100 ❌
Zivoty a zivoty nejsou totéž
Dobré jméno šetří čas.
x nebo a1 se píšou rychle, ale za chvíli už nevíš, co znamenají.
Naopak zivoty_hrace, max_zivoty nebo ma_klic řeknou všechno skoro hned.
Když píšeš jméno proměnné, představ si, že se k souboru vrátíš za měsíc. Jestli ho i tehdy pochopíš, je jméno dobré.
Python je dynamicky typovaný. Proměnná nemá typ napevno, typ má hodnota, která je v ní právě uložená.
x = 10 # x nyní odkazuje na int
x = "deset" # totéž jméno, jiný typ
To je rozdíl oproti C# nebo Javě, kde by int x zůstalo int napořád.
Pro děti je to výhoda — nemusí typy zapisovat. Nevýhoda je, že chyba typu
se ukáže až za běhu. Právě proto je užitečné nechat je občas schválně narazit
na TypeError a pak společně přečíst, co znamená.
= je příkaz pro uložení, ne matematické rovnítko+ se chová jinak u čísel a u textuint() a str() je záchrana, když se typy nepotkají| Ukázka | Co ukazuje | Čas |
|---|---|---|
| 1 | Čtyři datové typy a jejich názvy | 8 min |
| 2 | Proč + někdy sčítá a jindy spojuje |
10 min |
| 3 | Jak se z několika základních hodnot dopočítá zbytek | 10 min |
Krátká ukázka, ve které jsou vedle sebe všechny čtyři základní typy, se kterými dnes budeš pracovat.
jmeno a povolani na vlastní postavu.zivoty = 72 na jiné číslo a všimni si, že typ zůstává int.nasobitel = 1.5 třeba na 2.75 a sleduj, že typ je pořád float.True a False u proměnných ma_klic a je_otraveny.zivoty = "72" do uvozovek. Typ se změní z int na str.Tahle ukázka ukazuje jednu z nejběžnějších chyb začátečníků: míchat text a čísla, jako by to bylo totéž.
5 + 3 třeba na 12 + 7 a ověř, že se stále sčítá."5" + "3" na "drak" + "obří" a všimni si, že se texty jen slepí.zivoty = 72 na jiné číslo a sleduj, že f-string větu upraví sám.int() a kdy str().Jedno číslo se změní a několik dalších řádků se přepočítá samo. Přesně tohle je důvod, proč proměnné nejsou jen ozdobná jména.
zraneni = 38 a sleduj, kolik věcí se přepočítá najednou.uroven = 3 na vyšší číslo a všimni si, že naroste poškození.max_zivoty = 200 a sleduj, jak se změní progress bar i procenta.je_zraneny a odhadni, kdy bude True a kdy False.Než se pustíš do cvičení, mrkni na tuhle tabulku. Chyby nejsou ostuda. Většinou jen ukazují, že se potkaly dva různé typy nebo že někde chybí řádek.
| Chyba | Příčina | Řešení |
|---|---|---|
TypeError: can only concatenate str |
Sčítá text s číslem | str() nebo f-string |
NameError: name 'zivoty' is not defined |
Překlep nebo použití před vytvořením | Zkontrolovat pořadí řádků |
| Progress bar hlásí chybu | Hodnota mimo 0–1 | Dělit maximem: zivoty / max_zivoty |
SyntaxError u f-stringu |
Chybí f před uvozovkou |
Doplnit f |
| Hodnota se „nepřepsala" | Zapomenuté přiřazení: zivoty - 10 místo zivoty = zivoty - 10 |
Výsledek je nutné uložit |
Použij tenhle postup:
f na předchozím řádku.Programátor není člověk, který nedělá chyby. Programátor je člověk, který je umí přečíst.
Vytvoř kartu své postavy, ve které použiješ všechny čtyři datové typy.
- Vytvoř proměnnou typu
str— jméno postavy- Vytvoř dvě proměnné typu
int— životy a zlato- Vytvoř proměnnou typu
float— třeba rychlost nebo násobitel- Vytvoř proměnnou typu
bool— má klíč / umí létat / je neviditelný- Všechno vypiš na stránku pomocí
st.write
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–5, všechny typy použité |
| Rozšíření | Použít type(promenna).__name__ a u každé hodnoty vypsat její typ |
| Výzva | Přidat 8 vlastností a rozdělit je do dvou sloupců přes st.columns(2) |
Očekávaný výsledek: karta postavy, kde je vidět text, dvě čísla,
desetinné číslo a hodnota True nebo False.
Kde se zaseknou:
True a False píšou malými písmeny jako true a false2,5 místo 2.5)type(jmeno) a vyděsí je dlouhý zápis — ukažte .__name__Kdo je hotový dřív: ať přidá druhý sloupec, emoji v nadpisu nebo krátkou větu ve f-stringu, která spojí jméno, povolání a jednu číselnou vlastnost.
Tenhle program spadne. Najdi a oprav tři chyby. Nesmíš přepsat celý program, jen ho opravit.
- Spusť program a přečti si chybovou hlášku
- Najdi, na kterém řádku chyba je
- Oprav ji pomocí
str()neboint()- Spusť znovu a najdi další chybu
- Nakonec přepiš všechny výpisy na f-stringy
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Program se spustí bez chyby |
| Rozšíření | Bod 5 — všechny výpisy jsou f-stringy |
| Výzva | Přidat vlastní chybu, nechat souseda ji najít |
Očekávaný výsledek: program doběhne bez chyby a všechny věty dávají smysl.
Kde se zaseknou:
zlato = "25" na 25, ale pak nechají první a třetí výpis starým stylemstr(zivoty) / 2, čímž si vytvoří novou chybuDobrý postup: vždycky přečíst poslední řádek hlášky, najít řádek v kódu, opravit jen to jedno a spustit znovu.
Postav kartu, kde se všechno počítá samo z několika základních hodnot.
- Vytvoř proměnné:
sila,zbran_bonus,uroven- Spočítej
poskozeni = (sila + zbran_bonus) * uroven- Spočítej
poskozeni_kriticke = poskozeni * 2- Vytvoř
max_zivotyazraneni, spočítej z nich aktuální životy- Zobraz životy pomocí
st.progress(zivoty / max_zivoty)
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3, poškození se spočítá |
| Rozšíření | Body 4–5, funkční progress bar |
| Výzva | Přidat st.metric s delta a spočítat procenta na 1 desetinné místo |
Očekávaný výsledek: změna jednoho čísla nahoře přepočítá poškození, životy i progress bar.
Kde se zaseknou:
(sila + zbran_bonus) * urovenst.progress() pošlou celé zivoty místo podílu zivoty / max_zivotyzivoty = 62)"???" a myslí si, že úkol je hotovýKdo je hotový dřív: ať přidá st.metric pro poškození a kritický zásah,
nebo vypíše procenta zdraví přes {podil * 100:.1f}.
Ve hře máme vzdálenosti v krocích. Udělej převodník.
- Vytvoř proměnnou
kroky = 1500- Spočítej metry: jeden krok je
0.75metru- Spočítej kilometry
- Spočítej, jak dlouho cesta potrvá, když hrdina ujde 90 kroků za minutu
- Vypiš vše f-stringy zaokrouhlené na 1 desetinné místo pomocí
{hodnota:.1f}
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Body 4–5, zaokrouhlené výpisy |
| Výzva | Rozdělit čas na celé minuty a sekundy pomocí // a % |
Očekávaný výsledek:
1500 kroků = 1125.0 m = 1.1 km
Cesta potrvá 16.7 minut
Očekávaný výsledek: správný převod kroků na metry, kilometry a čas, ideálně s hezky zaokrouhleným výpisem.
Kde se zaseknou:
0,75 místo 0.75// a %Užitečná otázka: co je základní hodnota a co odvozená? Když to děti pojmenují, obvykle pak samy vědí, co se má počítat z čeho.
Rozšiřuje
app.pyz minulé hodiny.
- Nad herní pole přidej proměnné:
max_zivoty,zraneni,zlato,sila,uroven- Spočítej
zivoty = max_zivoty - zraneni- Spočítej
poskozeni = sila * uroven- Přidej řádek se čtyřmi
st.metric: životy, zlato, síla, úroveň- Přidej
st.progress(zivoty / max_zivoty)a pod herní pole vypiš f-stringem větu typu „Arkon má 62 ze 100 životů a útočí za 36."
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Body 4–5 |
| Výzva | Přidat nasobitel typu float a spočítat kritické poškození |
Očekávaný výsledek: známé app.py z minulé hodiny dostane panel statistik,
progress bar a větu složenou z proměnných.
Kde se zaseknou:
st.set_page_config(...) přesunou pod jiné příkazy Streamlitu a aplikace spadnest.metric napíšou čtyřikrát pod sebe místo do sloupcůzivoty místo zivoty / max_zivotyf, takže se zobrazí {zivoty} doslovaKdo je hotový dřív: ať přidá nasobitel = 1.5, spočítá kritický zásah
nebo doplní slider pro pozici hrdiny z minulé hodiny a propojí ho se statistikami.
V
app.pynahraď všechna napevno napsaná čísla proměnnými pojmenovanými nahoře v souboru. Pak zkus změnit jen jedno číslo (napříkladuroven = 10) a ověř, že se přepočítá celá karta. Napiš do komentáře, co všechno se změnilo.
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 je místo, kam se vyplatí sáhnout, když si chceš ověřit, jak něco v Pythonu funguje, nebo najít další příklady. Je v angličtině, ale to je v programování běžné — klidně se orientuj hlavně podle názvů, krátkých ukázek kódu a příkladů.
| Co jsme použili | Oficiální dokumentace | Co tam najdeš |
|---|---|---|
proměnné a přiřazení = |
Assignment statements | jak funguje ukládání hodnot do jmen |
str |
str |
práci s textem a metody řetězců |
int |
numeric types | celá čísla a číselné operace |
float |
numeric types | desetinná čísla a jejich chování |
bool |
bool |
hodnoty True, False a logiku |
| f-stringy | f-strings | vkládání hodnot a formátování textu |
type() |
type |
zjištění typu hodnoty a varianty použití |
int() |
int |
převod textu nebo čísla na integer |
str() |
str |
převod hodnoty na text |
float() |
float |
převod na desetinné číslo |
Pro rychlejší studenty, kteří dokončí cvičení dřív, nebo na posledních 10–15 minut.
| Cvičení | Odkaz | Proč se hodí |
|---|---|---|
| Programování v Pythonu | umimeinformatiku.cz | Přímo procvičuje proměnné a typy |
| Kódování a modelování | umimeinformatiku.cz | Reprezentace dat, čísla vs. text |
| Rozhodovačka | umimeinformatiku.cz | Rychlé ověření pochopení pojmů |