Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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)
Pokiaľ práve premýšľate nad tým, ako zapísať v reťazci symbol percenta bez toho, aby došlo k formátovaniu, jednoducho napíšte %% , napr. 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é).
Je toho samozrejme viac, ale to už je nad rámec dnešnej lekcie. Určite sa tomu budeme venovať ďalej v kurze. Príklady sú opäť na stiahnutie na konci lekcie.

 

Predchádzajúci článok
Boolovských hodnôt, logické operátory a vetvenia v Pythone
Všetky články v sekcii
Základné konštrukcie jazyka Python
Preskočiť článok
(neodporúčame)
Cykly v Pythone, funkcia range () a výraz pass
Článok pre vás napísal Vašek Doškář
Avatar
Užívateľské hodnotenie:
9 hlasov
Autor pracuje jako pedagog v oblasti elektroniky, elektrotechniky a programování. Rád tvoří appky všeho druhu. Má přehled v jazycích C#, Java, Kotlin, Javascript, Python a Rust
Aktivity