Lekce 6 - Textové řetězce v Pythonu
V minulé lekci, Typový systém podruhé - Datové typy v Pythonu, jsme si řekli více o datových typech v Pythonu.
V tomto Python tutoriálu se podíváme na textové řetězce. Naučíme se zjistit jejich délku, jak je sloučit, replikovat a mnoho dalšího.
Textové řetězce v Pythonu
Textové řetězce slouží k uchovávání textu. Jsou to v podstatě
sekvence znaků obklopené buď jednoduchými ('text'
), dvojitými
("text"
) nebo trojitými uvozovkami ('''text'''
nebo
"""text"""
). Díky této flexibilitě se naučíme snadno pracovat
s různými textovými formáty, včetně řetězců obsahujících uvozovky. S
řetězci lze provádět různé operace, jako je spojení, rozdělení,
vyhledávání podřetězců či měnění velikosti písmen.
Vytváření řetězců
Už jsme si řekli, že řetězce se v Pythonu vytvářejí za pomoci jednoduchých, dvojitých nebo trojitých uvozovek.
Jednoduché a dvojité uvozovky
Nejjednodušší varianta je vytvoření řetězce pomocí jednoduchých nebo dvojitých uvozovek:
prazdny_retezec = "" jiny_prazdny_retezec = '' jazyk = "Python" webova_stranka = 'ITnetwork.cz'
Kombinace jednoduchých a dvojitých uvozovek
Často potřebujeme v textu vypsat uvozovky. Abychom nemuseli znaky "escapovat", Python pro nás má řešení spočívající v kombinaci uvozovek:
zprava = 'Můj kamarád řekl: "Kdo používá Python, nikdy se nenudí!" A měl pravdu.'
print(zprava)
"Escapování" znaků znamená, že před speciálním znakem
vložíme zpětné lomítko (\
). Zpětné lomítko říká
programovacímu jazyku, že následující znak má být interpretován doslova
jako znak, a ne jako jeho speciální význam.
V konzoli uvidíme výstup:
Tvorba řetězců
Můj kamarád řekl: "Kdo používá Python, nikdy se nenudí!" A měl pravdu.
Na tom, zda budou vnější uvozovky jednoduché a vnitřní
dvojité nezáleží
Trojité uvozovky
Trojité uvozovky slouží k vytváření víceřádkových řetězců. I u
jednoduchých a dvojitých lze k odřádkování použít sekvenci
\n
, ale u delších textů je to nepohodlné:
zprava = "Toto je víceřádkový řetězec vytvořený\npoužitím dvojitých uvozovek a znaku pro nový řádek."
viceradkova_zprava = '''Toto je také víceřádkový
řetězec, ale je vytvořený pomocí
trojitých dvojitých uvozovek.'''
print(zprava)
print(viceradkova_zprava)
V konzoli uvidíme výstup:
Tvorba řetězců
Toto je víceřádkový řetězec vytvořený
použitím dvojitých uvozovek a znaku pro nový řádek.
Toto je také víceřádkový
řetězec, ale je vytvořený pomocí
trojitých dvojitých uvozovek.
Řetězce z pohledu logiky
Pokud budeme chtít řetězec hodnotit z hlediska logiky, tak prázdný
řetězec se vyhodnotí na bool hodnotu False
a neprázdný na
True
:
prazdny_retezec = ""
jazyk = "Python"
print(bool(prazdny_retezec))
print(bool(jazyk))
Výstupem v konzoli je:
Tvorba řetězců
False
True
Speciální znaky
Občas potřebujeme trochu "speciální" text. Například v konzoli poskočit na další řádku, vytisknout uvozovky a podobně. Tyto speciální znaky zapisujeme uvnitř řetězců bez mezer pomocí tzv. escape sekvencí, které začínají zpětným lomítkem:
\n
- nový řádek,\t
- tabulátor,\a
- zvonek (sekvecne pro pípnutí),\\
- zpětné lomítko se píše jako\\
, protože jedním\
začínají speciální znaky,\'
- jednoduché uvozovky,\"
- dvojité uvozovky.
Ukažme si příklad:
print("Tento řetězec \npokračuje na novém řádku, odskočí \to jeden tabulátor vypíše zpětné lomítko: \\ a jednoduchou uvozovku: \'. Pak skončí.")
V konzoli uvidíme:
Tvorba řetězců
Tento řetězec
pokračuje na novém řádku, odskočí o jeden tabulátor vypíše zpětné lomítko: \ a jednoduchou uvozovku: '. Pak skončí.
Operace s řetězci
S řetězci budeme provádět mnoho operací. Jak jsme si řekli už v úvodu lekce, můžeme např. určit jejich délku, sloučit je a replikovat. Pro práci s řetězci existuje mnoho funkcí a metod. Pojďme si ty nejdůležitější představit.
Zjištění délky řetězce
Délku řetězce zjistíme pomocí funkce len()
:
print(len("a"))
print(len("Python"))
V konzoli uvidíme:
Tvorba řetězců:
1
6
Slučování řetězců
Slučování je spojení více řetězců do jednoho. Něco na způsob
sčítání čísel. Jako operátor použijeme znaménko +
:
jazyk = "Python"
zprava = "je nejlepší!"
print(jazyk + zprava)
V konzoli uvidíme:
Tvorba řetězců:
Python je nejlepší!
Replikace
Replikace je "množení" řetězců. Zadaný řetězec se n-krát zopakuje,
stačí ho "vynásobit" číslem. My zkusíme řetězec Bum!
replikovat číslem 7
:
retezec = "Bum! "
print(retezec * 7)
V konzoli uvidíme:
Replikace řetězců:
Bum! Bum! Bum! Bum! Bum! Bum! Bum!
Metody
startswith()
, endswith()
a klíčové slovo
in
Můžeme se jednoduše zeptat, zda řetězec začíná, končí nebo zda
obsahuje určitý podřetězec (substring). Podřetězcem myslíme část
původního řetězce. Všechny tyto metody budou jako parametr brát
samozřejmě podřetězec a vracet hodnoty typu boolean
(True
/False
). Zatím na výstup neumíme reagovat, ale
pojďme si ho alespoň vypsat:
vstup = "Krokonosohroch"
print(vstup.startswith("krok"))
print(vstup.endswith("hroch"))
print("nos" in vstup)
print("roh" in vstup)
V konzoli uvidíme:
Metody řetězců:
False
True
True
False
Metody upper()
a
lower()
Rozlišování velkých a malých písmen může být někdy na obtíž.
Mnohdy se budeme potřebovat zeptat na přítomnost podřetězce tak, aby
nezáleželo na velikosti písmen. Situaci můžeme vyřešit pomocí metod
upper()
a lower()
, které vrací řetězec ve velkých
a v malých písmenech. Uveďme si reálnější příklad než je
Krokonosohroch. Budeme mít v proměnné řádek konfiguračního souboru,
který psal uživatel. Jelikož se na vstupy od uživatelů nelze spolehnout,
musíme se snažit eliminovat možné chyby, zde např. s velkými písmeny:
nastaveni = "Fullscreen shaDows autosave"
nastaveni = nastaveni.lower()
print("Poběží hra ve fullscreenu?")
print("fullscreen" in nastaveni)
print("Budou zapnuté stíny?")
print("shadows" in nastaveni)
print("Přeje si hráč vypnout zvuk?")
print("nosound" in nastaveni)
print("Přeje si hráč hru automaticky ukládat?")
print("autosave" in nastaveni)
V konzoli uvidíme:
Metody řetězců:
Poběží hra ve fullscreenu?
True
Budou zapnuté stíny?
True
Přeje si hráč vypnout zvuk?
False
Přeje si hráč hru automaticky ukládat?
True
Vidíme, že jsme schopni zjistit přítomnost jednotlivých slov v řetězci tak, že si nejprve řetězec převedeme celý na malá písmena (nebo na velká) a potom kontrolujeme přítomnost slova jen malými (nebo velkými) písmeny. Takhle by mimochodem mohlo opravdu vypadat jednoduché zpracování nějakého konfiguračního skriptu.
Metoda strip()
Další nástrahou mohou být mezery a obecně všechny tzv. bílé znaky,
které nejsou vidět, ale mohou nám uškodit. Obecně může být dobré
trimovat všechny vstupy od uživatele. Zkusme si v následující aplikaci
před číslo a za číslo zadat několik mezer, strip()
je
odstraní. Odstraňují se vždy bílé znaky kolem řetězce, nikoli
uvnitř:
print("Zadejte číslo:")
vstup = input()
print("Zadal jste text: " + vstup)
print("Text po funkci strip: " + vstup.strip())
cislo = int(vstup.strip())
print("Převedl jsem zadaný text na číslo parsováním, zadal jste: " + str(cislo))
V konzoli uvidíme:
Metody řetězců:
Zadejte číslo: 5
Zadal jste text: 5
Text po funkci strip: 5
Převedl jsem zadaný text na číslo parsováním, zadal jste: 5
Pokud potřebujeme odstranit bílé znaky pouze na začátku
nebo na konci řetězce, použijeme odvozené metody lstrip()
a
rstrip()
.
Metoda replace()
Asi nejdůležitější metodou pro datový typ str
v Pythonu je
nahrazení určité části řetězce jiným textem. Jako parametry metody
replace()
zadáme dva podřetězce: první je ten, který chceme
nahrazovat, a druhý je tím, kterým chceme nahradit. Metoda vrátí nový
řetězec, ve kterém proběhlo nahrazení. Pokud daný podřetězec metoda
replace()
nenajde, vrátí původní řetězec. Zkusme si to:
veta = "C# je nejlepší!"
veta = veta.replace("C#", "Python")
print(veta)
V konzoli uvidíme:
Metody řetězců:
Python je nejlepší!
Je toho ještě spoustu k vysvětlování a jsou další funkce metody,
které jsme zatím neprobrali. K řetězcům se ještě vrátíme později v
kurzu
V následujícím cvičení, Řešené úlohy k 5.-6. lekci Pythonu, si procvičíme nabyté zkušenosti z předchozích lekcí.