4. diel - Typový systém druhýkrát: Dátové typy v Pythone
V predchádzajúcej lekcii sme si povedali o základných dátových typoch v Pythone (int, float a str). V dnešnej lekcii sa na dátové typy pozrieme dôkladnejšie, a viac si ich vysvetlíme. Dnešná lekcia bude teda skôr teoretická, v tá budúca ale iste bude opäť praktická. Nakoniec si urobíme nejaké príklady.
Python rozlišuje dva druhy dátových typu, premenné (mutable) a nemenné (immutable).
Premenlivé a nemenné dátové typy
Všetky dátové typy v Pythone fungujú ako referencie. To znamená že hodnota premennej je uložená niekde v pamäti počítača, a prístup k nej máme prostredníctvom referencie (odkazu) na toto miesto v pamäti, čo je významný rozdiel od niektorých programovacích jazykov, kde sú hodnoty premenných priamo uložené v pamäti.
Všetky premenné v Pythone uchovávajú interne svoju adresu na ich dáta v pamäti. Tento spôsob umožňuje odkazovanie na jednu hodnotu z viacerých premenných pomocou rovnakej adresy. Vysvetlime si to viac na nasledujúcom príklade:
s1 = "Tohle je nějaký text"
s2 = s1
print(s1)
print(s2)
V ukážke vyššie je textový reťazec
"Tohle je nějaký text"
uložený v pamäti iba raz, ale sú tu
dve referencie odkazujúce na rovnaké miesto - premenné s1
a
s2
. Premenná s1
obsahuje referenciu na spomínaný
textový reťazec, premenná s2
odkazuje na premennú
s1
, teda má v sebe uloženú rovnakú adresu ako s1
.
Tento spôsob šetrí pamäť a bude sa nám hodiť, až budeme neskôr
pracovať s objektmi. Bolo by ale mätúce, keby sa viac premenných menilo,
keď je zmenená jedna z premenných, a preto sú základné dátové typy v
Pythone nemenné. Týmto sa však nenechajte zaskočiť, znamená to totiž, že
aj keď bude jedna premenná zmenená, ostatné hodnoty zostanú zachované. Nie
je tu žiadny spôsob, ako zmeniť predchádzajúci text, zato ale môžeme do
premennej priradiť nový reťazec, ak chceme zmeniť jeho hodnotu:
s1 = "Tohle je nějaký text"
s2 = s1
s2 = "Tohle je nějaký další text"
print(s1)
print(s2)
K tejto téme sa ešte vrátime v objektovo orientovanom kurze.
Ďalšie dátové typy
Pozrime sa na ďalšie dátové typy, ktoré Python ponúka.
Boolean
Premenné typu Boolean
umožňujú uložiť len dve
hodnoty - True
a False
. Najviac ich
využijeme až budeme pracovať s podmienkami. V Boolean premenných môžeme
teda ukladať hodnoty True
alebo False
alebo priamo
logické výrazy. Ukážme si to na nasledujúcom
príklade:
b = False
vyraz = 15 > 5
print(b)
print(vyraz)
Výstup programu je nasledujúci:
Konzolová aplikácia
False
True
Všimnite si, že výraz platí, teda je rovný True
, pretože
15 je väčší ako 5. Prejsť z výrazov k podmienkam je iba
malý krôčik, ale my sa podmienkam budeme venovať hneď v budúcej lekcii.
Python natívne zvládne viacero typov, ako napríklad komplexné čísla a
množiny, k tým sa ale dostaneme neskôr.
Funkcie textových reťazcov
Existuje samozrejme niekoľko ďalších vstavaných dátových typov, ale k
nim sa dostaneme neskôr. S textovými reťazcami budeme v našich programoch
pracovať naozaj často, preto mi dovoľte vás zoznámiť s niektorými
vstavanými metódami dátového typu str
, ktoré nám Python
ponúka. Rozdiel medzi funkciou a metódou je jednoduchý; pokiaľ
funkcia patrí nejakému objektu, nazývame ju terminologicky metódou.
Metódy potom voláme na tejto premennej. Skúsme si teda niektoré metódy.
startswith()
,
endswith()
, a operátor in
Môžeme sa opýtať, či nejaký reťazec začína alebo
končí nejakým podreťazcom. Podreťazec je časť reťazca.
Obe tieto metódy budú brať požadovaný podreťazec ako svoj parameter a
budú vracať Boolean
(True /
False) hodnotu. Ak by sme chceli zistiť, či reťazec obsahuje
(kdekoľvek) nejaký podreťazec, použijeme na to operátor in
. Na
výstup metódy zatiaľ nevieme reagovať, ale môžeme si aspoň pozrieť
výstupné hodnoty z týchto metód:
s = "Rhinopotamus"
print(s.startswith("rhin"))
print(s.endswith("tamus"))
print("pot" in s);
print("lol" in s);
Výstup z konzoly je potom nasledujúci:
Konzolová aplikácia
False
True
True
False
Môžeme vidieť, že všetko pracuje podľa očakávania. Prvá fráza je
nepravdivá (False
) pretože reťazec aktuálne začína veľkým
písmenom.
upper()
,
lower()
, capitalize()
, a title()
Rozlišovanie medzi veľkými a malými písmenami nie je vždy presne to,
čo chceme. Často budeme musieť skontrolovať prítomnosť podreťazca
bez ohľadu na veľkosť písmen. Túto situáciu je možné vyriešiť
pomocou metód upper()
a lower()
, ktoré
vracajú reťazec prevedený na malé alebo veľké písmená.
Urobme si teda reálnejší príklad ako ten predchádzajúci. Premenná bude
obsahovať riadok z konfiguračného súboru, ktorý bol napísaný
užívateľom. A pretože sa nemôžeme na užívateľský vstup plne
spoľahnúť, ošetríme teda prípadné chyby tým, je text
napísaný kombináciou veľkých a malých písiem tak, že celý
reťazec prevedieme na malé písmená:
config = "Fullscreen sTÍny autosave"
config = config.lower()
print("Bude hra v režimu fullscreen?")
print("fullscreen" in config)
print("Budou ve hře aktivní stíny?")
print("stíny" in config)
print("Bude zvuk vypnutý?")
print("Bezezvuku" in config)
print("Může hráč použít režim autosave?")
print("autosave" in config)
Výsledok bude:
Konzolová aplikácia
Bude hra v režimu fullscreen?
True
Budou ve hře aktivní stíny?
True
Bude zvuk vypnutý?
False
Může hráč použít režim autosave?
True
Vidíme, že sme v reťazci schopní odhaliť prítomnosť konkrétnych slov. Najprv prevedieme celý reťazec na malé (alebo veľké) písmená. Potom skontrolujeme prítomnosť slov v napísanom malými (veľkými) písmenami. Mimochodom, jednoduchým spracovaním konfiguračného skriptu by mohlo vyzerať napríklad takto.
Môžeme tiež jednoducho previesť prvé písmeno textu metódou
capitalize()
alebo dokonca prvé písmeno každého slova pomocou
metódy title()
:
jmeno= input("Zadej své jméno: ")
print("Ahoj " + jmeno.capitalize())
kniha = "Hobit, aneb cesta tam a zase zpátky"
print(kniha.title())
strip()
, lstrip()
, a
rstrip()
Ďalším problémom môžu byť medzery alebo tiež "biele znaky". Medzery nie sú pre užívateľov dobre viditeľné, ale môžu spôsobiť v programe problém. Obvykle je dobrou praktikou odstrániť všetky biele znaky z akéhokoľvek používateľského vstupu. Môžeme odstrániť buď všetky biele znaky v celom reťazci, alebo iba na jeho začiatku alebo na konci. Python v parsovacích funkciách automaticky odstraňuje medzery ešte pred samotným prevodom. Skúsme pridať napríklad niekoľko medzier pred aj za číslo a potom skúsme číslo naparzovať v nasledujúcej aplikácii:
s = input("Zadejte číslo:")
print("Originální zápis: " + s);
print("Váš text po použití metody strip(): " + s.strip())
a = int(s)
print("Převedl jsem vámi zadaný text na číslo. Zde je výsledek: " + str(a))
Výsledok:
Konzolová aplikácia
Zadejte číslo: 29
Originální zápis: 29
Váš text po použití metody strip(): 29
Převedl jsem vámi zadaný text na číslo. Zde je výsledek : 29
replace()
.
Asi najdôležitejšou metódou pre reťazce je schopnosť nahradiť časť
reťazca iným textom. Metóde replace()
zadáme dvoch podreťazcov
ako parametre, kedy prvá z nich je tá časť textu, ktorú chceme nahradiť, a
druhý je text, ktorý ho má nahradiť. Už vieme, že reťazce sú nemenné,
preto metóda vracia nový reťazec v ktorom došlo k nahradeniu. Pokiaľ
metóda nenájde hľadaný podreťazec, potom vráti celý pôvodný reťazec.
Môžeme tiež určiť najvyšší počet nahradení, ktoré sa majú vykonať.
Poďme si to vyskúšať:
s = "Java je úplně nejlepší!"
s = s.replace("Java", "Python")
print(s)
A ako výstup dostaneme:
Konzolová aplikácia
Python je úplně nejlepší!
Formátovací operátor
Python umožňuje veľmi praktickú cestu ako vložiť viac premenných na
rôzne miesta v reťazci použitím zástupných znakov. Tieto zástupné znaky
sú reprezentované znakom percento (%
) a ďalej požadovaným
dátovým typom. Skúsme si to:
a = 10
b = 20
c = a + b
s = "Když sečteme %d a %d, dostaneme %d" % (a, b, c)
print(s)
Výsledok:
Konzolová aplikácia
Když sečteme 10 a 20, dostaneme 30
Ďalším spôsobom formátovania je interpolácia, s ktorou sme sa stretli v predchádzajúcej lekcii Premenné, typový systém a parsovanie
Formátovanie je veľmi užitočné na tvorenie komplexných reťazcov z väčšieho množstva premenných. Tu sú najzákladnejšie zástupné znaky pre najčastejšie premenné:
- %d - Celá časť (int)
- %s - Reťazce(str)
- %f - Reálna čásla (float)
10%% = 10%
ljust()
, rjust()
,
center()
Nasledujúce metódy robia presný opak, teda vkladajú biele znaky do
reťazca. Na čo je to dobré? Predstavte si, že máme 100 premenných a chceme
ich usporiadať do tabuľky. Text by sme upravili pomocou metódy
rjust()
s parametrom šírky stĺpca, napr. 20 znakov. Ak
by mal text iba 12 znakov, vložilo by sa pred neho 8 medzier, aby bol dlhý 20
znakov. Metóda ljust()
by za text pridala 8 medzier. Ako
vytvoriť tabuľku sme sa zatiaľ neučili, preto sa viac na
tieto metódy pozrieme neskôr v kurze.
len()
Poslednou, avšak najdôležitejšou funkciou ktorú budeme určite veľa
využívať je globálna funkcia len()
ktorá nám
vracia dĺžku celého reťazca ako číslo (int):
name = input("Zadejte své jméno: ")
print("Vaše jméno je dlouhé %d znaků." % (len(name)))
Dostaneme:
Konzolová aplikácia
Zadejte své jméno: Tomáš Marný
Vaše jméno je dlouhé 11 znaků.
Metódy is*()
Pomocou is()
metód sa môžeme opýtať, či je možné
reťazec previesť na daný dátový typ (napr. ak je to číslo), to využijeme
neskôr na ošetrovanie užívateľských vstupov. Tieto metódy vracajú
Boolean
ové hodnoty:
isalnum()
- Vracia, či reťazec obsahuje iba alfanumerické znaky (pri prázdnych reťazcoch vracia False).isalpha()
- Vracia, či reťazec obsahuje iba znaky abecedy.isdecimal()
- Vracia, či reťazec obsahuje iba decimálne znaky.isdigit()
- Vracia, či reťazec obsahuje iba číslice.islower()
- Vracia, či je reťazec celý napísaný malými písmenami.isupper()
- Vracia, či je reťazec celý napísaný veľkými písmenami.isnumeric()
- Vracia, či reťazec obsahuje iba numerické znaky.isspace()
- Vracia, či reťazec obsahuje iba biele znaky(medzery, tabulátory atď...).istitle()
- Vracia, či reťazec je titulok (každé prvé písmeno je veľké).