← Přehled všech hodin

Řetězce, popisy a hlášky

Cíl hodiny: Naučíš se skládat text z proměnných, upravovat ho a kontrolovat, co uživatel napsal.
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. Pochopení tématu

Blok 1Řetězec je posloupnost znaků1. Pochopení tématu

Text je pro počítač řada písmenek za sebou. Úplně stejně jako seznam, jen místo věcí jsou tam znaky. A stejně jako u seznamu si můžeš sáhnout na jeden.

Tohle je důležitý most: co už umíš u seznamů, funguje i u textu.

Blok 2f-string je nejlepší způsob skládání textu1. Pochopení tématu

Podívej se postupně na tři způsoby a porovnej je:

f před uvozovkami znamená „tenhle text obsahuje okénka". Do složených závorek dáš cokoliv a Python to tam dosadí. Nemusíš nic převádět na text, dělá to sám.

f"Zbývá {100 - zivoty} do plného zdraví"
f"Poloviční zlato: {zlato // 2}"
f"Stav: {'živý' if zivoty > 0 else 'mrtvý'}"

Do závorek jde i výpočet.

Blok 3Formátování čísel v f-stringu1. Pochopení tématu

Tohle je skvělé, protože tvé výstupy najednou vypadají profesionálně:

Dvojtečka uvnitř složené závorky znamená „a takhle to naformátuj". .2f je „dvě desetinná místa", % je „ukaž to jako procenta".

Blok 4Metody řetězců1. Pochopení tématu

Klíčové upozornění:

Řetězec se v Pythonu nikdy nemění. Metody vždycky vracejí nový text. text.upper() samo o sobě nic neudělá — musíš si výsledek uložit: text = text.upper()

Tohle je velmi častá chyba a proti seznamům je to obráceně.

Blok 5split a join1. Pochopení tématu

Tyhle dvě metody patří k nejpoužívanějším.

split seká text na kousky, join je zase slepí. Jsou to opačné operace. U join píšeš lepidlo dopředu: ", ".join(...) znamená „slep to čárkami".

join je perfektní na hezký výpis inventáře.

Blok 6Víceřádkový text a escape sekvence1. Pochopení tématu

Zpětné lomítko říká „to, co následuje, ber jinak". \n není písmeno n, ale odřádkování.

Blok 7Kontrola vstupu od uživatele1. Pochopení tématu

Praktické použití, které rovnou využijeme:

Uživatel může napsat „ DRAKOBIJCE " s mezerami a velkými písmeny. strip() a lower() z toho udělají něco, co se dá spolehlivě porovnat. Vždycky takhle vstupy uklízej, než je porovnáváš.

text.isdigit()    # samé číslice
text.isalpha()    # samá písmena
text == ""        # prázdný vstup
len(text) < 3     # moc krátké

Užitečné kontroly pro validaci vstupu.

Blok 8Streamlit a text1. Pochopení tématu

st.write rozumí markdownu — hvězdičky udělají tučné písmo. Když chceš text přesně tak, jak ho napíšeš, použij st.text.

Poznámky pro učiteleTechnické pozadí pro učitele1. Pochopení tématu
  • Řetězce jsou immutable stejně jako v C#. s += x v cyklu vytváří nové objekty; pro velké spojování používat "".join(seznam) (analogie StringBuilder).
  • f-string je vyhodnocen za běhu a je rychlejší než % i .format().
  • len() vrací počet znaků, ne bajtů. Python 3 pracuje s Unicode, takže len("ěščř") == 4.
  • sorted() na češtině řadí podle Unicode kódů, takže „Č" skončí až za „Z". Řešení locale.strxfrm do hodiny nepatří, ale vy o tom vědět máte.
Blok 9Časté chyby1. Pochopení tématu
Chyba Příčina Řešení
TypeError: can only concatenate str "text" + 5 f-string nebo str(5)
text.upper() nic neudělá Výsledek se neuložil text = text.upper()
Chybí f před uvozovkami "{jmeno}" vypíše závorky Doplnit f
Porovnání nefunguje Mezery nebo velká písmena .strip().lower()
SyntaxError v f-stringu Stejné uvozovky uvnitř Střídat ' a "
IndexError: string index out of range Index mimo text Kontrolovat len()

2. Ukázky pro projekci

Ukázka 1 — f-string naživo

demo/demo1_fstring.py
import streamlit as st

st.title("f-string: skládáme text")

jmeno = st.text_input("Jméno hrdiny", "Arkon")
zivoty = st.slider("Životy", 0, 100, 72)
zlato = st.number_input("Zlato", 0, 99999, 1234)

st.divider()

st.subheader("Tři způsoby, jak to napsat")

st.code(
    '# 1) Sčítání - musíš převádět čísla\n'
    '"Hrdina " + jmeno + " má " + str(zivoty) + " životů"\n\n'
    '# 2) f-string - jednoduché a čitelné\n'
    'f"Hrdina {jmeno}{zivoty} životů"'
)

st.write("Výsledek:", f"Hrdina {jmeno}{zivoty} životů")

st.divider()

st.subheader("Formátování čísel")

st.code(
    f'f"{{zlato:,}}"        ->  {zlato:,}\n'
    f'f"{{zivoty/100:.0%}}" ->  {zivoty / 100:.0%}\n'
    f'f"{{zivoty/3:.2f}}"   ->  {zivoty / 3:.2f}\n'
    f'f"{{jmeno:>15}}|"     ->  {jmeno:>15}|\n'
    f'f"{{jmeno:^15}}|"     ->  {jmeno:^15}|'
)

st.divider()
st.subheader("Výpočet uvnitř závorek")
st.code(
    f'f"Do plného zdraví: {{100 - zivoty}}"  ->  Do plného zdraví: {100 - zivoty}\n'
    f'f"Stav: {{...}}"                       ->  Stav: {"živý" if zivoty > 0 else "mrtvý"}'
)

Ukázka 2 — Metody řetězců

demo/demo2_metody.py
import streamlit as st

st.title("Co všechno umí text")

text = st.text_input("Napiš cokoliv", "  Ohnivá Koule  ")

st.caption("Uvozovky ukazují, kde text začíná a končí.")

st.code(
    f"původní          ->  {text!r}\n"
    f".strip()         ->  {text.strip()!r}\n"
    f".upper()         ->  {text.upper()!r}\n"
    f".lower()         ->  {text.lower()!r}\n"
    f".title()         ->  {text.title()!r}\n"
    f".replace('a','@')->  {text.replace('a', '@')!r}\n"
    f"len()            ->  {len(text)}"
)

st.divider()

st.subheader("Text jako seznam znaků")
if text:
    st.code(
        f"text[0]   ->  {text[0]!r}\n"
        f"text[-1]  ->  {text[-1]!r}\n"
        f"text[0:5] ->  {text[0:5]!r}\n"
        f"text[::-1]->  {text[::-1]!r}   (pozpátku)"
    )

st.divider()

st.subheader("split a join")
slova = text.split()
st.code(
    f"text.split()      ->  {slova}\n"
    f"' | '.join(slova) ->  {' | '.join(slova)!r}\n"
    f"počet slov        ->  {len(slova)}"
)

st.divider()
st.warning("Pozor: metody vracejí NOVÝ text. Původní se nikdy nezmění!")

Ukázka 3 — Generátor popisů

demo/demo3_generator.py
import streamlit as st

st.set_page_config(page_title="Generátor", page_icon="📜")
st.title("📜 Generátor popisů míst")

a, b = st.columns(2)
misto = a.selectbox("Místo", ["les", "jeskyně", "věž", "bažina"])
nalada = b.selectbox("Nálada", ["klidná", "napjatá", "hrozivá"])

jmeno = st.text_input("Jméno hrdiny", "Arkon")
denni_doba = st.radio("Denní doba", ["ráno", "poledne", "noc"], horizontal=True)

if misto == "les":
    scenerie = "vysoké stromy a koberec z listí"
elif misto == "jeskyně":
    scenerie = "vlhké stěny a ozvěna kapající vody"
elif misto == "věž":
    scenerie = "kamenné schodiště a chladný průvan"
else:
    scenerie = "hnijící kořeny a bublající bahno"

if nalada == "klidná":
    pocit = "Nic se nehýbe. Můžeš na chvíli vydechnout."
elif nalada == "napjatá":
    pocit = "Něco tě sleduje. Ruka ti sama sjede k meči."
else:
    pocit = "Vzduch je těžký strachem. Tady někdo zemřel."

popis = f"""### {misto.title()}{denni_doba}

{jmeno} vstupuje. Kolem {scenerie}.

{pocit}
"""

st.divider()
st.markdown(popis)

st.divider()
st.subheader("Jak je popis složený")
st.code(popis, language="markdown")

3. Cvičení na hodinu

Blok 10Cvičení 1 — Vizitka hrdiny (15 min)3. Cvičení na hodinu

Tvoje zadání:

  1. Přidej st.text_input na jméno a st.selectbox na povolání
  2. Přidej slidery na sílu, magii a obratnost
  3. Sestav pomocí f-stringu jednu větu: „Arkon je Bojovník se silou 15."
  4. Vypiš statistiky zarovnané do sloupečku pomocí f"{nazev:<12}{hodnota:>3}" a st.text
  5. Přidej součet bodů zobrazený s oddělovačem tisíců
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4 se zarovnáním
Výzva Přidat procentuální podíl každé statistiky ze součtu {x/soucet:.0%}
cviceni/cviceni1_vizitka.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.
Tip — na co si dát pozor

Očekávaný výsledek: úhledná vizitka, kde jsou čísla pod sebou.

Řešení 1 — jedna z možných variant
reseni/reseni1_vizitka.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 11Cvičení 2 — Heslo do věže (20 min)3. Cvičení na hodinu

Tvoje zadání:

  1. Vytvoř proměnnou spravne_heslo = "drakobijce"
  2. Přidej st.text_input na zadání hesla
  3. Uprav vstup pomocí .strip().lower() a teprve pak porovnávej
  4. Ošetři prázdný vstup — nic nehlas, dokud uživatel nic nenapsal
  5. Přidej nápovědu: kolik má heslo písmen a jaké je první písmeno
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Body 4–5
Výzva Počítat pokusy v session_state a po třech ukázat celé heslo
cviceni/cviceni2_heslo.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.
Tip — na co si dát pozor

Očekávaný výsledek: heslo projde i s mezerami a velkými písmeny.

Řešení 2 — jedna z možných variant
reseni/reseni2_heslo.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 12Cvičení 3 — Kouzelný překladač (20 min)3. Cvičení na hodinu

Tvoje zadání:

  1. Přidej st.text_area na delší text
  2. Přidej st.radio s volbami: VELKÁ / malá / Pozpátku / Elfsky
  3. „Elfsky" znamená nahradit všechna „a" za „ae" a „o" za „oo"
  4. Zobraz výsledek a pod ním počet znaků a počet slov
  5. Přidej st.download_button, kterým se výsledek stáhne jako .txt
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 + „Trpaslicky": každé slovo velkými a s vykřičníkem
cviceni/cviceni3_prekladac.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.
Tip — na co si dát pozor

Očekávaný výsledek: text se okamžitě přepisuje podle zvoleného jazyka.

Řešení 3 — jedna z možných variant
reseni/reseni3_prekladac.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í 4 — Hlášky ze souboje (20 min)3. Cvičení na hodinu

Tvoje zadání:

  1. Přidej vstupy: jméno útočníka, jméno cíle, poškození, typ útoku
  2. Sestav základní hlášku f-stringem: „Arkon zasáhl Skřeta za 15 poškození."
  3. Podle poškození přidej přídavek: pod 5 „škrábnutí", nad 20 „drtivá rána"
  4. Poskládej tři různé varianty hlášky a nech uživatele vybrat styl (Suchý / Dramatický / Vtipný)
  5. Vypiš posledních pět hlášek pomocí seznamu v session_state a "\n".join()
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 s omezením na posledních pět pomocí řezu [-5:]
cviceni/cviceni4_hlasky.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.
Tip — na co si dát pozor

Očekávaný výsledek: bojový log, který zní jako z opravdové hry.

Řešení 4 — jedna z možných variant
reseni/reseni4_hlasky.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í 5 — PyQuest: hra začne mluvit (25 min)3. Cvičení na hodinu

Tvoje zadání:

  1. Nahraď pevné texty ve hře f-stringy, které používají jméno hrdiny
  2. Vytvoř funkční popis místa složený z několika částí (co vidíš, co slyšíš, co cítíš)
  3. Inventář vypisuj jednou větou přes ", ".join(inventar)
  4. Deník ukládej jako hotové věty s pořadovým číslem výpravy
  5. Přidej „vypravěče": text, který se mění podle toho, kolik má hrdina životů
Úroveň Co má zvládnout
Minimum Body 1–3
Rozšíření Bod 4
Výzva Bod 5 + tlačítko na stažení celého deníku jako textového souboru
cviceni/cviceni5_pyquest_texty.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.
Tip — na co si dát pozor

Očekávaný výsledek: hra působí, jako by ji vyprávěl skutečný vypravěč.

Řešení 5 — jedna z možných variant
reseni/reseni5_pyquest_texty.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 15Domácí úkol na příští hodinu4. Domácí úkol

Vytvoř generátor jmen pro nepřátele: dva seznamy (přídavné jméno a podstatné jméno) a st.selectbox na obojí. Výsledné jméno slož f-stringem, například „Krvavý Skřet". Přidej titul podle délky jména.

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

Oficiální dokumentace se hodí, když si chceš ověřit, jak Python pracuje s textem, jak psát f-stringy nebo co přesně dělají jednotlivé metody řetězců. Je v angličtině, ale dobře se v ní hledá podle názvu funkce nebo krátkých ukázek kódu.

Co jsme použili Oficiální dokumentace Co tam najdeš
str str co je řetězec a jak se v Pythonu chová
metody řetězců String Methods přehled metod jako upper, lower, replace nebo startswith
split() str.split rozdělení textu na části
join() str.join spojování více textů dohromady
strip() str.strip ořezání mezer nebo jiných znaků z kraje textu
replace() str.replace nahrazování části textu jiným textem
f-stringy f-strings vkládání proměnných a formátování hodnot do textu
len() len zjištění délky textu
st.text_input st.text_input textové pole a jeho nastavení
st.write st.write výpis textu, proměnných i formátovaných hodnot

5. Umíme informatiku

Blok 17Navazující cvičení na Umíme informatiku5. Umíme informatiku
Cvičení Odkaz Proč se hodí
Doplňování textu umimeinformatiku.cz Práce s textem v kódu
Psaná odpověď umimeinformatiku.cz Přesnost zápisu
Programování v Pythonu umimeinformatiku.cz Řetězce v Pythonu
Kódování a modelování umimeinformatiku.cz Reprezentace textu