upper/lower/strip/replace/split/join, indexování textu, escape sekvenceText 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.
Podívej se postupně na tři způsoby a porovnej je:
fpř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.
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".
.2fje „dvě desetinná místa",%je „ukaž to jako procenta".
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ě.
Tyhle dvě metody patří k nejpoužívanějším.
splitseká text na kousky,joinje zase slepí. Jsou to opačné operace. Ujoinpíšeš lepidlo dopředu:", ".join(...)znamená „slep to čárkami".
join je perfektní na hezký výpis inventáře.
Zpětné lomítko říká „to, co následuje, ber jinak".
\nnení písmeno n, ale odřádkování.
Praktické použití, které rovnou využijeme:
Uživatel může napsat „ DRAKOBIJCE " s mezerami a velkými písmeny.
strip()alower()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.
st.writerozumí markdownu — hvězdičky udělají tučné písmo. Když chceš text přesně tak, jak ho napíšeš, použijst.text.
s += x v cyklu vytváří nové objekty;
pro velké spojování používat "".join(seznam) (analogie StringBuilder).% 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.| 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() |
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} má {zivoty} životů"'
)
st.write("Výsledek:", f"Hrdina {jmeno} má {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ý"}'
)
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í!")
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")
Tvoje zadání:
- Přidej
st.text_inputna jméno ast.selectboxna povolání- Přidej slidery na sílu, magii a obratnost
- Sestav pomocí f-stringu jednu větu: „Arkon je Bojovník se silou 15."
- Vypiš statistiky zarovnané do sloupečku pomocí
f"{nazev:<12}{hodnota:>3}"ast.text- 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%} |
Očekávaný výsledek: úhledná vizitka, kde jsou čísla pod sebou.
Tvoje zadání:
- Vytvoř proměnnou
spravne_heslo = "drakobijce"- Přidej
st.text_inputna zadání hesla- Uprav vstup pomocí
.strip().lower()a teprve pak porovnávej- Ošetři prázdný vstup — nic nehlas, dokud uživatel nic nenapsal
- 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 |
Očekávaný výsledek: heslo projde i s mezerami a velkými písmeny.
Tvoje zadání:
- Přidej
st.text_areana delší text- Přidej
st.radios volbami: VELKÁ / malá / Pozpátku / Elfsky- „Elfsky" znamená nahradit všechna „a" za „ae" a „o" za „oo"
- Zobraz výsledek a pod ním počet znaků a počet slov
- 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 |
Očekávaný výsledek: text se okamžitě přepisuje podle zvoleného jazyka.
Tvoje zadání:
- Přidej vstupy: jméno útočníka, jméno cíle, poškození, typ útoku
- Sestav základní hlášku f-stringem: „Arkon zasáhl Skřeta za 15 poškození."
- Podle poškození přidej přídavek: pod 5 „škrábnutí", nad 20 „drtivá rána"
- Poskládej tři různé varianty hlášky a nech uživatele vybrat styl (Suchý / Dramatický / Vtipný)
- Vypiš posledních pět hlášek pomocí seznamu v
session_statea"\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:] |
Očekávaný výsledek: bojový log, který zní jako z opravdové hry.
Tvoje zadání:
- Nahraď pevné texty ve hře f-stringy, které používají jméno hrdiny
- Vytvoř funkční popis místa složený z několika částí (co vidíš, co slyšíš, co cítíš)
- Inventář vypisuj jednou větou přes
", ".join(inventar)- Deník ukládej jako hotové věty s pořadovým číslem výpravy
- 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 |
Očekávaný výsledek: hra působí, jako by ji vyprávěl skutečný vypravěč.
Vytvoř generátor jmen pro nepřátele: dva seznamy (přídavné jméno a podstatné jméno) a
st.selectboxna obojí. Výsledné jméno slož f-stringem, například „Krvavý Skřet". Přidej titul podle délky jména.
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, 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 |
| 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 |