6. diel - Textové reťazce v Pythone
V minulej lekcii, Cykly v Pythone , sme sa zaoberali cyklami.
V minulej lekcii, Cykly v Pythone , sme sa venovali zoznamom. V dnešnom Python tutoriálu sa pozrieme na textové reťazce. Naučíme sa určenie ich dĺžky, zlučovanie, replikáciu a mnoho ďalšieho.
Reťazca
Textové reťazce slúži k uchovávaniu textu.
Vytváranie
Reťazce sa vytvárajú za pomoci jednoduchých alebo dvojitých apostrofov.
prazdny_retezec_1 = "" prazdny_retezec_2 = '' retezec_3 = "Python" retezec_4 = 'Iný text!'
Prázdny reťazec sa vyhodnotia na boolean False
, neprázdny na
True
.
{PYTHON}
prazdny_retezec_1 = ""
prazdny_retezec_2 = ''
retezec_3 = "Python"
retezec_4 = 'Iný text!'
print(bool(prazdny_retezec_1))
print(bool(retezec_3))
{/PYTHON}
výstup:
>>> bool(prazdny_retezec_1) False >>> bool(retezec_3) True
Špeciálne znaky
Občas potrebujeme trochu "špeciálny" text. Napríklad v konzole poskočiť na ďalšie riadku, vytlačiť úvodzovky pod. Tieto špeciálne znaky zapisujeme pomocou tzv. Escape sekvencií, ktoré začínajú spätným lomítkom.
Nový riadok
Nový riadok sa zapíše ako \n
. Príklad:
{PYTHON}
print("Prvý riadok\nDruhý riadok")
{/PYTHON}
Do konzoly sa vypíše Prvý riadok
, Potom sa skočí
na ďalší, a tam sa vypíše Druhý riadok
.
Tabulátor
Tabulátor sa zapíše ako \t
. Príklad:
{PYTHON}
print("Pred\tZa")
{/PYTHON}
Tabulátor zarovnáva slová tak, aby každé slovo po tabulátora začínalo na pozíciu, ktorá je násobkom 8 (prvý znak reťazca sa počíta od nuly).
Zvonček
Zvonček sa zapíše ako \a
. Užitočné, ak chcete v nejakej
konzolovej aplikácii zapípať.
Spätné lomítko
Spätné lomítko sa zapíše ako \\
, pretože \
začínajú špeciálne znaky. Ak nepotrebujeme žiadne špeciálne znaky
začínajúce \
, môžeme použiť tzv. Holé
reťazca. Tie sa vytvárajú rovnako ako reťazce, ale pred prvou
úvodzovky sa napíše navyše r
. Holý reťazec berie každý znak
v reťazci zvlášť, takže napr. r"\n"
, berie holý reťazec ako
spätné lomítko a n
, nie ako znak pre nový riadok.
Úvodzovky
Jednoduché úvodzovky sa zapíšu ako \'
, dvojité ako
\"
. Ak používame reťazec vytvorený z jednoduchých úvodzoviek
('
), tak možno písať dvojité úvodzovky ("
) bez
problémov, bez nutnosti potlačenie. A naopak. Možno tiež použiť aj
trojité úvodzovky ('''Text'''
alebo """Text"""
),
potom nemusíte používať pred úvodzovkami v texte spätné lomítko.
"Problém" s reťazcami
Reťazce sú iterovatelný objekt! Skladajú sa totiž z jednotlivých znakov. Preto keď pri vytváraní zoznamu použijeme nejaký reťazec, uloží sa nám do neho jednotlivé znaky.
Príklad:
{PYTHON}
seznam = list("abcde")
print(seznam)
{/PYTHON}
Vďaka tomu môžeme testovať, či nejaký reťazec neobsahuje iný reťazec.
Príklad:
{PYTHON}
print("kra" in "okraj")
print(";" in "python")
{/PYTHON}
A možno je prechádzať cyklom.
{PYTHON}
for znak in "python":
print(znak)
{/PYTHON}
Dĺžka reťazca
Dĺžka reťazca sa zistí funkciou len()
.
Príklady:
{PYTHON}
print(len("a"))
print(len("Python"))
print(len("Reťazca"))
print(len("Reťazca v Pythone."))
{/PYTHON}
Zlučovanie
Zlučovanie je spojenie viacerých reťazcov do jedného. Niečo na spôsob
sčítanie čísel. Ako operátor použijeme znamienko +
.
Príklad:
{PYTHON}
retezec_1 = "Python"
retezec_2 = " je najlepší!"
print(retezec_1 + retezec_2)
{/PYTHON}
Replikácie
Replikácie je "množenie" reťazcov. Zadaný reťazec sa n
-krát zopakuje, stačí ho "vynásobiť" nejakým číslom.
Príklad:
{PYTHON}
retezec = "Bum! "
print(retezec * 7)
{/PYTHON}
Prevod znaku na číslo a späť
Znaky sa prevádzajú na čísla o desiatkovom základu
pomocou funkcie ord()
. Späť sa prevádzajú funkciou
chr()
. Každý znak má svoju číselnú hodnotu. A keďže Unicode
v sebe zahŕňa ASCII, tak čísla "základných znakov", možno zistiť pomocou
ASCII tabuľky.
Príklad:
{PYTHON}
print(ord("a"))
print(chr(97))
{/PYTHON}
Programy
Teraz máme základný prehľad o reťazcoch. Preto teraz upravíme jeden, už predtým vyrobený program a ďalší si vytvoríme
Rozbor vety
Tu je náš prvý program:
{PYTHON}
print("Program zistí z čoho sa skladá slovo.")
slovo = input("Zadajte 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ňpqrřsštťvwxzž":
souhlasky = souhlasky + 1
elif znak in "0123456789":
cisel = cisel + 1
else:
ostatni = ostatni + 1
print(slovo, "má: ")
print("samohlások", samohlasky)
print("spoluhlások", souhlasky)
print("čísel", cisel)
print("ostatných znakov...", ostatni)
input("\nAplikáciu ukončíte stlačením ľubovoľného klávesu...")
{/PYTHON}
Program možno vďaka nadobudnutým znalostiam písať trochu lepšie.
- Počet nečíselných znakov možno dopočítať pomocou funkcie
len()
. - Číslice
"0"
až"9"
majú v ASCII tabuľke hodnoty48
až57
.
{PYTHON}
print("Program zistí z čoho sa skladá slovo.")
slovo = input("Zadajte 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ňpqrřsštťvwxzž":
souhlasky = souhlasky + 1
elif ord(znak) in range(48, 58):
cisel = cisel + 1
else:
pass
print(slovo, "má: ")
print("samohlások", samohlasky)
print("spoluhlások", souhlasky)
print("čísel", cisel)
print("ostatných znakov...", len(slovo) - samohlasky - souhlasky - cisel)
input("\nAplikáciu ukončíte stlačením ľubovoľného klávesu...")
{/PYTHON}
Cézarovho šifra
Vytvoríme si jednoduchý program pre na šifrovanie textu. Ak ste niekedy
počuli o Cesarova šifre, bude to presne to, čo si tu naprogramujeme.
Šifrovanie textu spočíva v posúvaní znaku v abecede o určitý, pevne
stanovený počet znakov. Napríklad slovo ahoj
sa s posunom textu
o 1
preloží ako bipk
. Posun umožníme
užívateľovi vybrať. Algoritmus tu máme samozrejme opäť vysvetlený a to v
článku Cézarovho
šifra. Program si dokonca môžete vyskúšať v praxi - Online Cézarovho
šifra.
Vráťme sa k programovaniu a pripravme si kód. Budeme potrebovať premenné
pre pôvodné text, pre zašifrovanú správu a pre posun. Ďalej cyklus
prechádzajúce jednotlivé znaky a výpis zašifrované správy. Správu si
necháme zapísanú napevno v kóde, aby sme ju nemuseli pri každom spustení
programu písať. Po dokončení nahradíme obsah premennej funkcií
input()
. Šifra nepočíta s diakritikou, medzier a
interpunkčných znamienok. Diakritiku budeme bojkotovať a budeme
predpokladať, že ju užívateľ nebude zadávať. Ideálne by sme potom mali
diakritiku pred šifrovaním odstrániť, rovnako tak hocičo okrem písmen.
# inicializácia premenných retezec = "cernediryjsoutamkdebuhdelilnulou" print("Pôvodná správa:", retezec) zprava = "" posun = 1 # cyklus prechádzajúce jednotlivé znaky for znak in retezec: pass # výpis print("Zašifrované správa:", zprava) input()
Teraz sa presunieme dovnútra cyklu, prevedieme znak znak
na
ASCII hodnotu (čiže ordinálna hodnotu), túto hodnotu zvýšime o
posun
a prevedieme späť na znak. Tento znak nakoniec pripojíme k
výslednej správe:
{PYTHON}
# inicializácia premenných
retezec = "cernediryjsoutamkdebuhdelilnulou"
print("Pôvodná správa:", retezec)
zprava = ""
posun = 1
# cyklus prechádzajúce jednotlivé znaky
for znak in retezec:
i = ord(znak)
i = i + posun
znak = chr(i)
zprava = zprava + znak
# výpis
print("Zašifrované správa:", zprava)
input()
{/PYTHON}
Program si vyskúšame. Výsledok vyzerá celkom dobre. Skúsme si však
zadať vyššiu posun alebo napísať slovo zebra
.
Vidíme, že znaky môžu po "z"
pretiecť do ASCII hodnôt
ďalších znakov, v texte teda už nemáme len písmená, ale ďalšie
škaredé znaky. Uzavrieme znaky do kruhu tak, aby posun plynulo po
"z"
prešiel opäť k "a"
a ďalej. Postačí nám k
tomu jednoduchá podmienka, ktorá od novej ASCII hodnoty odpočíta celú
abecedu tak, aby sme začínali opäť na "a"
.
{PYTHON}
# inicializácia premenných
retezec = "cernediryjsoutamkdebuhdelilnulou"
print("Pôvodná správa:", retezec)
zprava = ""
posun = 1
# cyklus prechádzajúce jednotlivé znaky
for znak in retezec:
i = ord(znak)
i = i + posun
# kontrola pretečeniu
if (i > ord("z")):
i = i - 26
znak = chr(i)
zprava = zprava + znak
# výpis
print("Zašifrované správa:", zprava)
input()
{/PYTHON}
Ak i
presiahne ASCII hodnotu "z"
, znížime ho o
26
znakov (toľko znakov má anglická abeceda). Je to jednoduché
a náš program je teraz funkčná. Všimnime si, že nikde nepoužívame priame
kódy znakov, v podmienke je ord("z")
, aj keď by sme tam mohli
napísať rovno 122
. Je to z dôvodu, aby bol náš program plne
odtienený od explicitných ASCII hodnôt a bolo lepšie viditeľné, ako
funguje.
Výsledný kód:
{PYTHON}
# inicializácia premenných
retezec = input("Zadajte slovo: ")
posun = int(input("Zadajte posun: "))
print("Pôvodná správa:", retezec)
zprava = ""
# cyklus prechádzajúce jednotlivé znaky
for znak in retezec:
i = ord(znak)
i = i + posun
# kontrola pretečeniu
if (i > ord("z")):
i = i - 26
znak = chr(i)
zprava = zprava + znak
# výpis
print("Zašifrované správa:", zprava)
input()
{/PYTHON}
V budúcej lekcii, Textové reťazce v Pythone - pokračovanie , nás čaká prehĺbenie vedomostí o reťazcoch. Naučíme sa je formátovať, porovnávať a používať ich metódy.
V budúcej lekcii, Textové reťazce v Pythone - pokračovanie , nás čaká prehĺbenie vedomostí o reťazcoch. Naučíme sa je formátovať, porovnávať a používať ich metódy.