6. díl - Textové řetězce v Pythonu

Python Základní konstrukce Textové řetězce v Pythonu

V tomto dílu se podíváme na textové řetězce. Naučíme se určení jejich délky, slučování, replikaci a mnoho dalšího.

Řetězce

Textové řetězce slouží k uchovávání textu.

Vytváření

Řetězce se vytvářejí za pomoci jednoduchých nebo dvojitých apostrofů.

prazdny_retezec_1 = ""
prazdny_retezec_2 = ''
retezec_3 = "Python"
retezec_4 = 'Jiný text!'

Prázdný řetězec se vyhodnotí na booleovskou hodnotu False, neprázdný na True.

>>> bool(prazdny_retezec_1)
False
>>> bool(retezec_3)
True

Speciální znaky

Občas potřebujeme trochu "speciální" text. Například v konzoli poskočit na další řádku, vytisknout uvozovky apod. Tyto speciální znaky zapisujeme pomocí tzv. escape sekvencí, které začínají zpětným lomítkem.

Nový řádek

Nový řádek se zapíše jako \n . Příklad:

>>> print("První řádek\nDruhý řádek")
První řádek
Druhý řádek

Do konzole se vypíše První řádek, poté se skočí na další, a tam se vypíše se vypíše Druhý řádek.

Tabulátor

Tabulátor se zapíše jako \t . Příklad:

>>> print("Před\tZa")
Před   Za

Tabulátor zarovnává slova tak, aby každé slovo po tabulátoru začínalo na pozici, která je násobkem 8 (první znak řetězce se počítá od nuly)

Zvonek

Zvonek se zapíše jako \a . Užitečné, pokud chcete v nějaké konzolové aplikaci zapípat.

Zpětné lomítko

Zpětné lomítko se zapíše jako \\ , protože \ začínají speciální znaky. Pokud nepotřebujeme žádné speciální znaky začínající \, můžeme použít tzv. holé řetězce. Ty se vytvářejí stejně jako řetězce, ale před první uvozovku se napíše navíc r. Holý řetězec bere každý znak v řetězci zvlášť, takže např. r"\n", bere holý řetězec jako zpětné lomítko a n, ne jako znak pro nový řádek.

Uvozovky

Jednoduché uvozovky se zapíší jako \' , dvojité jako \" . Pokud používáme řetězec vytvořený z jednoduchých uvozovek ('), tak lze psát dvojité uvozovky (") bez problémů, bez nutnosti potlačení. A naopak. Lze také použít i trojité uvozovky ('''Text''' anebo """Text"""), pak nemusíte používat před uvozovkami v textu zpětné lomítko.

"Problém" s řetězci

Řetězce jsou iterovatelný objekt! Skládají se totiž z jednotlivých znaků. Proto když při vytváření seznamu použijeme nějaký řetězec, uloží se nám do něj jednotlivé znaky.

Příklad:

>>> seznam = list("abcde")
>>> print(seznam)
['a', 'b', 'c', 'd', 'e']

Díky tomu můžeme testovat, jestli nějaký řetězec neobsahuje jiný řetězec.

Příklad:

>>> "kra" in "okraj"
True
>>> ";" in "python"
False

A lze je procházet cyklem.

>>> for znak in "python":
>>>     print(znak)
'p'
'y'
't'
'h'
'o'
'n'

Délka řetězce

Délka řetězce se zjistí funkcí len().

Příklady:

>>> len("a")
1
>>> len("Python")
6
>>> len("Řetězce")
7
>>> len("Řetězce v Pythonu.")
18

Slučování

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 +.

Příklad:

>>> retezec_1 = "Python"
>>> retezec_2 = " je nejlepší!"
>>> print(retezec_1 + retezec_2)
Python je nejlepší!

Replikace

Replikace je "množení" řetězců. Zadaný řetězec se n-krát zopakuje, stačí ho "vynásobit" nějakým číslem.

Příklad:

>>> retezec = "Bum! "
>>> print(retezec * 7)
Bum! Bum! Bum! Bum! Bum! Bum! Bum!

Převod znaku na číslo a zpět

Znaky se převádějí na čísla o desítkovém základu pomocí funkce ord(). Zpět se převádějí funkcí chr(). Každý znak má svoji číselnou hodnotu. A jelikož Unicode v sobě zahrnuje ASCII, tak čísla "základních znaků", lze zjistit pomocí ASCII tabulky.

Příklad:

>>> ord("a")
97
>>> chr(97)
'a'

Programy

Nyní máme základní přehled o řetězcích. Proto teď upravíme jeden, již dříve vyrobený program a další si vytvoříme :)

Rozbor věty

Zde je náš první program:

print("Program zjistí z čeho se skládá slovo.")
slovo = input("Zadejte slovo: ")
samohlasky = 0
souhlasky = 0
ostatni = 0
cisel = 0
for znak in slovo:
    if znak in "aáeéěiíoóuúů":
        samohlasky = samohlasky + 1
    elif znak in "bcčdďfghjklmnňprřsštťvwxzž":
        souhlasky = souhlasky + 1
    elif znak in "0123456789":
        cisel = cisel + 1
    else:
        ostatni = ostatni + 1
print(slovo, "má: ")
print("samohlásek", samohlasky)
print("souhlásek", souhlasky)
print("čísel", cisel)
print("ostatních znaků...", ostatni)
input("\nAplikaci ukončíte stisknutím libovolné klávesy...")

Program lze díky nabytým znalostem psát trochu lépe.

  1. Počet nečíselných znaků lze dopočítat pomocí funkce len.
  2. Číslice 0 až 9 mají v ASCII tabulce hodnoty 48 až 57.

Vylepšený program:

print("Program zjistí z čeho se skládá slovo.")
slovo = input("Zadejte slovo: ")
samohlasky = 0
souhlasky = 0
cisel = 0
for znak in slovo:
    if znak in "aáeéěiíoóuúů":
        samohlasky = samohlasky + 1
    elif znak in "bcčdďfghjklmnňprřsštťvwxzž":
        souhlasky = souhlasky + 1
    elif ord(znak) in range(48, 58):
        cisel = cisel + 1
    else:
        pass
print(slovo, "má: ")
print("samohlásek", samohlasky)
print("souhlásek", souhlasky)
print("čísel", cisel)
print("ostatních znaků...", len(slovo) - samohlasky - souhlasky - cisel)
input("\nAplikaci ukončíte stisknutím libovolné klávesy...")

Césarova šifra

Vytvoříme si jednoduchý program pro na šifrování textu. Pokud jste někdy slyšeli o Césarově šifře, bude to přesně to, co si zde naprogramujeme. Šifrování textu spočívá v posouvání znaku v abecedě o určitý, pevně stanovený počet znaků. Například slovo "ahoj" se s posunem textu o 1 přeloží jako "bipk". Posun umožníme uživateli vybrat. Algoritmus zde máme samozřejmě opět vysvětlený a to v článku Césarova šifra. Program si dokonce můžete vyzkoušet v praxi - Online Césarova šifra.

Vraťme se k programování a připravme si kód. Budeme potřebovat proměnné pro původní text, pro zašifrovanou zprávu a pro posun. Dále cyklus projíždějící jednotlivé znaky a výpis zašifrované zprávy. Zprávu si necháme zapsanou napevno v kódu, abychom ji nemuseli při každém spuštění programu psát. Po dokončení nahradíme obsah proměnné funkcí input(). Šifra nepočítá s diakritikou, mezerami a interpunkčními znaménky. Diakritiku budeme bojkovat a budeme předpokládat, že ji uživatel nebude zadávat. Ideálně bychom poté měli diakritiku před šifrováním odstranit, stejně tak cokoli kromě písmen.

# inicializace proměnných
retezec = "cernediryjsoutamkdebuhdelilnulou"
print("Původní zpráva:", retezec)
zprava = ""
posun = 1

# cyklus projíždějící jednotlivé znaky
for znak in retezec:
    pass
# výpis
print("Zašifrovaná zpráva:", zprava)
input()

Nyní se přesuneme dovnitř cyklu, převedeme znak c na ASCII hodnotu (neboli ordinální hodnotu), tuto hodnotu zvýšíme o posun a převedeme zpět na znak. Tento znak nakonec připojíme k výsledné zprávě:

i = ord(znak)
i = i + posun
znak = chr(i)
zprava = zprava + znak

Program si vyzkoušíme. Výsledek vypadá docela dobře. Zkusme si však zadat vyšší posun nebo napsat slovo "zebra". Vidíme, že znaky mohou po "z" přetéct do ASCII hodnot dalších znaků, v textu tedy již nemáme jen písmena, ale další ošklivé znaky. Uzavřeme znaky do kruhu tak, aby posun plynule po "z" přešel opět k "a" a dále. Postačí nám k tomu jednoduchá podmínka, která od nové ASCII hodnoty odečte celou abecedu tak, abychom začínali opět na "a".

i = ord(znak)
i = i + posun
# kontrola přetečení
if (i > ord("z")):
    i = i - 26
znak = chr(i)
zprava = zprava + znak

Pokud i přesáhne ASCII hodnotu "z", snížíme ho o 26 znaků (tolik znaků má anglická abeceda). Je to jednoduché a náš program je nyní funkční. Všimněme si, že nikde nepoužíváme přímé kódy znaků, v podmínce je ord("z"), i když bychom tam mohli napsat rovnou 122. Je to z důvodu, aby byl náš program plně odstíněn od explicitních ASCII hodnot a bylo lépe viditelné, jak funguje.

Výsledný kód:

# inicializace proměnných
retezec = input("Zadejte slovo: ")
posun = int(input("Zadejte posun: "))
print("Původní zpráva:", retezec)
zprava = ""

# cyklus projíždějící jednotlivé znaky
for znak in retezec:
    i = ord(znak)
    i = i + posun
    # kontrola přetečení
    if (i > ord("z")):
        i = i - 26
    znak = chr(i)
    zprava = zprava + znak
# výpis
print("Zašifrovaná zpráva:", zprava)
input()

Ukázka:

Šifrování textu v Pythonu

Příště nás čeká prohloubení znalostí o řetězcích. Naučíme se je formátovat, porovnávat a používat jejich metody.


 

  Aktivity (5)

Článek pro vás napsal gcx11
Avatar
(^_^)

Jak se ti líbí článek?
Celkem (6 hlasů) :
55555


 


Miniatura
Předchozí článek
Cvičení k 5. lekci Pythonu
Miniatura
Všechny články v sekci
Základní konstrukce jazyka Python

 

 

Komentáře
Zobrazit starší komentáře (10)

Avatar
uramovan
Člen
Avatar
uramovan:

mne to ukazuje tiez 18, len ma zmiatol clanok...potom je v clanku chyba ;)

 
Odpovědět 2.5.2015 17:29
Avatar
hanpari
Redaktor
Avatar
Odpovídá na uramovan
hanpari:

Nejspis ano. To se stava

 
Odpovědět 2.5.2015 20:56
Avatar
hanpari
Redaktor
Avatar
Odpovídá na uramovan
hanpari:

Nejspis ano. To se stava

 
Odpovědět 2.5.2015 20:56
Avatar
Petr Dušek
Člen
Avatar
Petr Dušek:

V posledním příkladu je chyba if (i > ord("z")): by mělo být posunutý

 
Odpovědět 2.12.2015 23:36
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Petr Dušek
gcx11:

Ahoj, díky za upozornění, poslal jsem opravu.

 
Odpovědět 3.12.2015 0:06
Avatar
gepard
Člen
Avatar
gepard:

Ahoj, neměl by někdo vysvětlení tohoto chování?

for znak in slovo:
  if znak in "aeiouyáéíóúůý":
    samohlasky += 1
  elif znak in "bcčdďfghjklmnňprřsštťvwxzž":
    souhlasky += 1
  else ord(znak) in range(48, 58): #"0123456789"
    cisla += 1

$ python3.4 006_samohlasky.py
File "006_samohlas­ky.py", line 16
else ord(znak) in range(48, 58): #"0123456789"
^

Když to napíšu takto

elif ord(znak) in range(48, 58): #"0123456789"
  cisla += 1
else:
  pass

tak to nepadá.

Odpovědět 20. března 13:19
Kdo chce, hledá způsob. Kdo nechce, hledá důvod.
Avatar
gepard
Člen
Avatar
Odpovídá na gepard
gepard:

Zpráva nejde editovat, takže jinak: Ta šipka chyby je pod d, ne pod e.
$ python3.4 006_samohlasky.py
File "006_samohlas­ky.py", line 16
else ord(znak) in range(48, 58): #"0123456789"
.........^

Odpovědět 20. března 13:27
Kdo chce, hledá způsob. Kdo nechce, hledá důvod.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na gepard
gcx11:

K else se nic nedává, tam se při větvení dostaneš, pokud dříve nezapadneš do jiné větve.

 
Odpovědět 20. března 14:08
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

Tabulátory
Ohledně mezery, jenž vznikne - mezera závisí na velikost slov. Pokud budou slova moc dlouhá, mezera bude malá.

To je dost nejasná formulace. Podle toho by totiž tabulátor za 100-znakovým "slovem" měl být kratší než ten za 30-znakovým. Je to naopak... Délka tabulátoru je podle zbytku po dělení 4 - tabulátor zarovnává tak, aby pozice za ním byla dělitelná 4.

Odpovědět  +1 18. října 20:54
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
gcx11:

Aha, špatně jsem interpretoval, co ten tabulátor vlastně dělá. Děkuji za upozornění.

 
Odpovědět 20. října 10:23
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 20. Zobrazit vše