V předchozí kapitole jsme si představili tři důležité typy hodnot: celá čísla, desetinná čísla a seznamy. Dnes přidáme další důležitý typ hodnot, abychom v Pythonu mohli pracovat nejen s čísly, ale i s texty.
Řetězce
Pokud chceme v Pythonu zadat nějak kousek textu, použijeme takzvaný stringřetězec. Řetězce se v Pythonu uzavírají do jednoduchých nebo dvojitých uvozovek. Například:
>>> 'martin'
>>> '12. března 2018'
>>> "prací prášek"
>>> "Don't panic"
Řetězce se chovají v něčem podobně jako čísla a v něčem podobně jako seznamy. Můžeme je například sčítat
>>> jmeno = 'martin' + ' ' + 'podloucký'
Můžeme však také přistupovat k jednotlivým písmenům nebo pracovat s podřetězci.
>>> jmeno[3]
't'
>>> jmeno[:6]
'martin'
>>> jmeno[7:]
'podloucký'
Podobně jako u seznamů můžeme na řetězcích volat také funkci len()
>>> len(jmeno)
16
Jelikož řetězec je opět hodnota jako každá jiná, není problém vyrobit seznam řetězců
>>> jmena = ['martin', 'jana', 'petr', 'simona']
Převody hodnot
Do této chvíle jsme viděli čtyři typy hodnot: celá čísla, desetinná čísla, řetězce a seznamy. Je velmi důležité se naučit vždy si dobře uvědomovat hodnotu jakého typu máme v proměnné zrovna uloženou.
Uvažte proměnnou definovanou takto
>>> vek = '18'
Všimněte si, že číslo 18 je uzavřeno v uvozovkách. To znamená, že jej Python
chápe jako kus textu, tedy sekvenci symbolů 1
a 8
. Pythonu nezáleží na
tom, jaké symboly používáte uvnitř řetězců, písmenka jsou pro něj totéž jako
číslice. Řetězec '18'
je pro něj tedy skoro totéž jako 'ahoj'
nebo
'Petr'
, prostě nějaký kousek textu.
Pokud se tedy pokusíte například o takovýto výpočet
>>> vek + 5
obdržíte od Pythonu chybu:
Traceback (most recent call last):
File "<stdin>", line 1, in
TypeError: Can't convert 'int' object to str implicitly
Touto zprávou se nám snaží Python říct, že neví, jak má sečíst řetězec a
číslo. Python umí sečíst dvě čísla nebo dva řetězce, ale sčítat řetězec a
číslo je jako byste po něm chtěli spočítat 'ahoj' + 1
. Takový výpočet nedává
smysl.
Převod z řetězce na číslo a zpět
S výše uvedeným problémem si můžeme poradit pomocí několika nových funkcí.
První se jmenuje int()
. Pokud této funkci dáte řetězec, jenž obsahuje celé
číslo, vrátí vám tato funkce hodnotu typu celé číslo.
>>> int('18')
18
Podobně můžete použít funkci float()
na řetězce obsahující desetinná čísla.
>>> float('3.14')
3.14
Často také budeme potřebovat převést nějakou hodnotu na řetězec. K tomu nám
slouží funkce str()
. Mějme například takového proměnné:
>>> hodin = 12
>>> minut = 35
Chceme-li vyrobit hezky vypadající čas ve formátu 12:35, použijeme funkci
str()
takto:
>>> str(hodin) + ':' + str(minut)
'12:35'
Metody
V minulé lekci jsme viděli takzvané funkce, které za nás vykonávají často
opakované činnosti jako například zaokrouhlování, zjišťování délky seznamu
apod. Některé funkce se však hodí na práci pouze s jedním typem hodnoty.
Například bychom mohli mít funkci upper()
, která by převedla všechna písmena
v řetězci na velká písmena. Kdyby taková funkce existovala, mohli bychom ji
volat třeba takto
>>> upper('martin')
'MARTIN'
Je pochopitelné, že taková funkce funguje pouze pro řetězce. Pro ostatní hodnoty nedává smysl. Těžko si představit, co by taková funkce měla vrátit například v takovémto případě:
>>> upper(3.14)
Funkce, které pracují pouze na jednom typu hodnoty, se programátoři Pythonu
rozhodli svázat přímo s touto hodnotu. Můžeme tedy říct, že funkce upper()
patří řetězcům. Pokud tedy máme nějaký řetězec, funkci, která patří pouze k
typu řetězec, zavoláme pomocí takzvané tečkové notace.
>>> 'martin'.upper()
'MARTIN'
Funkcím, které patří jen konkrétním typům hodnot, říkáme metody. Všimněte
si, že metoda upper()
pro řetězce v Pythonu skutečně existuje, takže výše
uvedený kód bude opravdu fungovat. Podobně existuje například metoda
lower()
. Vyzkoušejte si ji.
Užitečné metody na řetězcích
strip()
: Odstraní všechny bílé znaky na začátku a konci řetězce
>>> ' martin '.strip()
'martin'
split(sep)
: Rozseká řetězec na kousky podle zadaného oddělovače sep. Např.
>>> 'po ut st čt pá'.split(' ')
['po', 'ut', 'st', 'čt', 'pá']
nebo
>>> '3.12,4.1,9.6,-127,0'.split(',')
['3.12', '4.1', '9.6', '-127', '0']
>>> '3.12,4.1,9.6,-127,0'.split('.')
['3', '12,4', '1,9', '6,-127,0']
join(list)
: Spojí řetězce v seznamu list do jednoho velkého řetězce podle zadaného separátoru.
>>> '+'.join(['1', '2', '3', '4'])
'1+2+3+4'
>>> '/'.join(['dokumenty', 'dapraha', 'python', 'priklady'])
'dokumenty/dapraha/python/priklady'
Cvičení: Řetězce, metody
Převod písmen
Uložte si do proměnné jmeno
svoje jméno. Pomocí volání vhodných metod jej
převeďte nejdříve na všechna písmena malá a poté na všechna písmena velká.
Čísla jako text
Mějme seznam desetinných čísel zadaných jako text
hodnoty = ['12', '1', '7', '-11']
Potřebujeme k třetímu číslu v seznamu přičíst 4, aby výsledek vypadal takto:
hodnoty = ['12', '1', '11', '-11']
Před tím, než se podíváte na následující kroky, sami si rozmyslete postup, jak toto provést. Až když si nejste jistí, pokračujte podle následujících kroků.
- Uložte si hodnotu na třetí pozici v seznam do nějaké proměnné.
- Převeďte tuto hodnotu na číslo a přičtěte k němu 4. Výsledek uložte do proměnné
vysledek
. - Převeďte hodnotu v proměnné
vysledek
zpět na řetězec a uložte ji na třetí pozici v seznamu hodnoty.
Čísla v textu
Máme obdobné zadání jako v předchozím cvičení, avšak tentokrát máme čísla zadána nikoliv v seznamu ale v řetězci oddělená mezerou:
hodnoty = '12.1 1.68 7.45 -11.51'
K poslednímu číslu v seznamu chceme přičíst 0.25 tak, aby výsledek vypadal takto
hodnoty = '12.1 1.68 7.45 -11.26'
Určitě se vám budou hodit metody split
a join
.
Bonusy
Chytřejší čísla jako text
Zkuste vymyslet, jak udělat zápis příkazů ze cvičení Čísla jako text co nejúspornější. Dá se dojít až k tomu, že celé řešení bude na jeden řádek v Python konzoli.