Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akce až 50 % zdarma při nákupu e-learningu. 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í.

Lekce 4 - Typový systém podruhé: Datové typy v Pythonu

V předešlém cvičení, Řešené úlohy k 1.-3. lekci Pythonu, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

V předchozím tutoriálu základů programování v jazyku Python lekci jsme si řekli o základních datových typech v Pythonu (int, float a str). Nyní se na datové typy podíváme důkladněji, a více si je vysvětlíme. Dnešní lekce bude tedy spíše teoretická. Nakonec si ale i tak ukážeme nějaké příklady.

Python rozlišuje dva druhy datových typu, proměnné (mutable) a neměnné (immutable).

Proměnlivé a neměnné datové typy

Všechny datové typy v Pythonu fungují jako reference. To znamená, že hodnota proměnné je uložena někde v paměti počítače. My k ní pak přistupujeme prostřednictvím reference (odkazu) na toto místo v paměti. To je významný rozdíl od některých programovacích jazyků, kde jsou hodnoty proměnných přímo uloženy v paměti.

Všechny proměnné v Pythonu uchovávají interně svou adresu na jejich data v paměti. Tento způsob umožňuje odkazování na jednu hodnotu z více proměnných pomocí stejné adresy. Vysvětleme si to na následujícím příkladu:

s1 = "Tohle je nějaký text"
s2 = s1
print(s1)
print(s2)

V ukázce výše je textový řetězec "Tohle je nějaký text" uložen v paměti pouze jednou. Jsou tu ale dvě reference odkazující na stejné místo - proměnné s1 a s2. Proměnná s1 obsahuje referenci na zmíněný textový řetězec, proměnná s2 odkazuje na proměnnou s1. Má tedy má v sobě uloženou stejnou adresu jako s1. Tento způsob šetří paměť a bude se nám hodit, až budeme později pracovat s objekty. Bylo by ale matoucí, kdyby se více proměnných měnilo, když je změněna jedna z proměnných. Proto jsou základní datové typy v Pythonu neměnné. To znamená, že i když bude jedna proměnná změněna, ostatní hodnoty zůstanou zachovány. Není tu žádný způsob, jak změnit předchozí text, zato ale můžeme do proměnné přiřadit nový řetězec, pokud chceme změnit jeho hodnotu:

s1 = "Tohle je nějaký text"
s2 = s1
s2 = "Tohle je nějaký další text"
print(s1)
print(s2)

K tomuto tématu se ještě vrátíme v objektově orientovaném kurzu.

Další datové typy

Podívejme se na další datové typy, které Python nabízí.

Boolean

Proměnné typu Boolean umožňují uložit jen dvě hodnoty - True a False. Nejvíce je využijeme při práci s podmínkami. V Boolean proměnných můžeme tedy ukládat hodnoty True nebo False, případně přímo logické výrazy. Ukažme si to na následujícím příkladu:

b = False
vyraz = 15 > 5
print(b)
print(vyraz)

Výstup programu je následující:

Konzolová aplikace
False
True

Výraz platí, tedy je roven True, protože 15 je větší než 5. Přejít z výrazů k podmínkám je sice jen malý krůček, ale my se podmínkám budeme věnovat až v příští lekci.

Funkce textových řetězců

Existuje samozřejmě několik dalších vestavěných datových typů, ale k nim se dostaneme později. S textovými řetězci budeme v našich programech pracovat opravdu často, proto se nyní seznámíme s některými vestavěnými metodami datového typu str, které nám Python nabízí. Rozdíl mezi funkcí a metodou je jednoduchý; pokud funkce náleží nějakému objektu, nazýváme ji terminologicky metodou. Metody pak voláme na této proměnné. Zkusme si tedy některé metody použít v praxi.

Metody startswith(), endswith(), a operátor in

Můžeme se zeptat, zda řetězec začíná nebo končí nějakým podřetězcem. Podřetězec je část řetězce. Obě tyto metody budou brát požadovaný podřetězec jako svůj parametr a budou vracet Boolean (True/False) hodnotu. Pokud bychom chtěli zjistit, zda řetězec obsahuje (kdekoliv) nějaký podřetězec, použijeme k tomu operátor in. Na výstup metody zatím neumíme reagovat, nicméně můžeme si alespoň prohlédnout výstupní hodnoty z těchto metod:

s = "Rhinopotamus"
print(s.startswith("rhin"))
print(s.endswith("tamus"))
print("pot" in s);
print("lol" in s);

Výstup z konzole je pak následující:

Konzolová aplikace
False
True
True
False

Vidíme, že vše pracuje podle očekávání. První fráze je nepravdivá (False), protože řetězec aktuálně začíná velkým písmenem.

Metody upper(), lower(), capitalize(), a title()

Rozlišování mezi velkými a malými písmeny není vždy přesně to, co chceme. Často budeme muset zkontrolovat přítomnost podřetězce bez ohledu na velikost písmen. Tuto situaci lze vyřešit pomocí metod upper() a lower(), které vracejí řetězec převedený na malá nebo velká písmena. Udělejme si tedy reálnější příklad než ten předchozí. Proměnná bude obsahovat řádek z konfiguračního souboru, který byl napsán uživatelem. A protože se nemůžeme na uživatelský vstup plně spolehnout, ošetříme případné chyby tím, že celý řetězec převedeme na malá písmena:

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ýsledek bude:

Konzolová aplikace
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 jsme v řetězci schopni odhalit přítomnost konkrétních slov. Nejprve převedeme celý řetězec na malá (nebo velká) písmena. Potom zkontrolujeme přítomnost slov v textu napsaných malými (velkými) písmeny.

Metodou capitalize() můžeme snadno převést pouze první písmeno textu. První písmeno každého slova v zadaném řetězci pak převedeme na kapitálky pomocí metody title():

jmeno= input("Zadej své jméno: ")
jmeno= jmeno.lower()
print("Ahoj " + jmeno.capitalize())
kniha = "Hobit, aneb cesta tam a zase zpátky"
print(kniha.title())
Metody strip(), lstrip(), a rstrip()

Dalším problémem mohou být mezery nebo též "bílé znaky". Mezery nejsou pro uživatele dobře viditelné, ale mohou způsobit v programu problémy. Obvykle je dobrou praktikou odstranit všechny bílé znaky z jakéhokoliv uživatelského vstupu. Můžeme odstranit buď všechny bílé znaky v celém řetězci, nebo pouze na jeho začátku, nebo na konci. Python v parsovacích funkcích automaticky odstraňuje mezery ještě před samotným převodem. Zkusme přidat například několik mezer před i za číslo. Poté zkusme takové číslo naparsovat v následující aplikaci:

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ýsledek:

Konzolová aplikace
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
Metoda replace()

Velmi důležitou metodou pro řetězce je schopnost nahradit část řetězce jiným textem. Metodě replace() zadáme dva podřetězce jako parametry. První z nich je ta část textu, kterou chceme nahradit. Druhý je pak text, který ji má nahradit. Už víme, že řetězce jsou neměnné. Metoda proto vrací nový řetězec, ve kterém došlo k nahrazení. Pokud metoda nenalezne hledaný podřetězec, vrátí celý původní řetězec. Můžeme též určit nejvyšší počet nahrazení, která mají být provedeny. Pojďme si to vyzkoušet:

s = "Java je úplně nejlepší!"
s = s.replace("Java", "Python")
print(s)

A dostaneme tento výstup:

Konzolová aplikace
Python je úplně nejlepší!
Formátovací operátor

Python umožňuje velmi praktickou cestu jak použitím zástupných znaků vložit více proměnných na různá místa v řetězci. Tyto zástupné znaky jsou reprezentovány znakem procento (%) a požadovaným datovým typem. Zkusme si to:

a = 10
b = 20
c = a + b
s = "Když sečteme %d a %d, dostaneme %d" % (a, b, c)
print(s)

Výsledek:

Konzolová aplikace
Když sečteme 10 a 20, dostaneme 30

Dalším způsobem formátování je interpolace, se kterou jsme se setkali v předchozí lekci Proměnné, typový systém a parsování

Formátování je velice užitečné pro tvoření komplexních řetězců z většího množství proměnných. Zde jsou nejzákladnější zástupné znaky pro nejčastější proměnné:

  • %d - celá čásla (int),
  • %s - řetězce(str),
  • %f - reálná čásla (float).

Jak ale zapsat v řetězci symbol procenta bez toho, aby došlo k formátování? Jednoduše napíšeme znak procenta dvakrát, tedy %%. Např. 10%% = 10%

Metody ljust(), rjust(), center()

Následující metody vkládají bílé znaky do řetězce. K čemu je to dobré? Představme si, že máme 100 proměnných a chceme je uspořádat do tabulky. Text bychom upravili pomocí metody rjust() s parametrem šířky sloupce, např. 20 znaků. Pokud má text pouze 12 znaků, vloží se před něj osm mezer, aby byl dlouhý 20 znaků. Metoda ljust() přidá osm mezer za text. Vytvořit tabulku jsme se neučili, proto se více na tyto metody podíváme později v kurzu.

Funkcelen()

Poslední, avšak nejdůležitější funkcí, kterou budeme jistě hodně využívat, je globální funkce len(). Funkce vrací délku celého řetězce jako číslo (int):

name = input("Zadejte své jméno: ")
print("Vaše jméno je dlouhé %d znaků." % (len(name)))

Dostaneme tento výstup:

Konzolová aplikace
Zadejte své jméno: Tomáš Marný
Vaše jméno je dlouhé 11 znaků.
Metody is*()

Pomocí is() metod se můžeme zeptat, zda lze řetězec převést na daný datový typ (např. pokud je to číslo). Toho využijeme později k ošetřování uživatelských vstupů. Tyto metody vrací Boolean hodnoty:

  • isalnum() - Vrací, zda řetězec obsahuje pouze alfanumerické znaky (u prázdných řetězců vrací False).
  • isalpha() - Vrací, zda řetězec obsahuje pouze znaky abecedy.
  • isdecimal() - Vrací, zda řetězec obsahuje pouze decimální znaky.
  • isdigit() - Vrací, zda řetězec obsahuje pouze číslice.
  • islower() - Vrací, zda je řetězec celý napsaný malými písmeny.
  • isupper() - Vrací, zda je řetězec celý napsaný velkými písmeny.
  • isnumeric() - Vrací, zda řetězec obsahuje pouze numerické znaky.
  • isspace() - Vrací, zda řetězec obsahuje pouze bílé znaky(mezery, tabulátory atd...).
  • istitle() - Vrací, zda řetězec je titulek (každé první písmeno je velké).

Je toho samozřejmě více, ale to už je nad rámec dnešní lekce. Určitě se tomu budeme věnovat dále v kurzu. Příklady jsou opět ke stažení na konci lekce.

V příští lekci, Podmínky a větvení v Pythonu, nás čekají podmínky a větvení v Pythonu


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 309x (6.12 kB)
Aplikace je včetně zdrojových kódů v jazyce Python

 

Předchozí článek
Řešené úlohy k 1.-3. lekci Pythonu
Všechny články v sekci
Základní konstrukce jazyka Python
Přeskočit článek
(nedoporučujeme)
Podmínky a větvení v Pythonu
Článek pro vás napsal gcx11
Avatar
Uživatelské hodnocení:
662 hlasů
(^_^)
Aktivity