6. diel - Typový systém druhýkrát - Dátové typy v Pythone
V predchádzajúcom cvičení, Riešené úlohy k 3.-5. lekcii Pythonu, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
Dnešný Python tutoriál bude teoretickejší, keďže sa dôkladnejšie pozrieme na dátové typy a vysvetlíme si, kedy ktorý použiť. Na konci si ale aj tak ukážeme nejaké príklady.
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. My k nej potom pristupujeme prostredníctvom referencie (odkazu) na toto miesto v pamäti. To je významný rozdiel oproti niektorým programovacím jazykom, kde sú hodnoty premenných priamo uložené v pamäti.
Všetky premenné v Pythone interne uchovávajú adresu svojich dát v pamäti. Tento spôsob umožňuje odkazovanie na jednu hodnotu z viacerých premenných pomocou rovnakej adresy. Vysvetlime si to na nasledujúcom príklade:
s1 = "Python!"
s2 = s1
print(s1)
print(s2)
V konzole uvidíme výstup:
References:
Python!
Python!
V ukážke vyššie je textový reťazec Python! uložený v
pamäti iba raz. Sú tu ale 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. Má teda 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.
Meniteľné a nemeniteľné dátové typy
Python rozlišuje dva druhy dátových typov:
- meniteľné (mutable)
- a nemeniteľné (immutable).
Nás budú zatiaľ zaujímať tie základné, ktoré sú nemeniteľné.
Nemeniteľné dátové typy
Nemeniteľné (immutable) typy okrem iného zahŕňajú:
int– celé čísla,float– desatinné čísla,Decimal– desatinné čísla s presným výpočtom,bool– logická hodnota (pravda/nepravda),str– textový reťazec,Fraction– zlomky v tvare čitateľa a menovateľa,complex– komplexné čísla s reálnou a imaginárnou časťou.
Bolo by mätúce, keby zmena jednej z premenných menila viac premenných. Práve preto sú základné dátové typy v Pythone nemenné:
s1 = "This is the original text"
s2 = s1
s1 = "This is the new text"
print(s1)
print(s2)
V konzole vidíme výstup:
Immutable types:
This is the new text
This is the original text
Akonáhle vytvoríme nemeniteľný objekt (ako je napr. reťazec), nemôžeme už jeho hodnotu meniť. Ak vykonáme nejakú akciu, ktorá by normálne zmenila hodnotu reťazcovej premennej, Python vytvorí v pamäti nový objekt a náš názov premennej bude odkazovať na tento nový objekt. Starý objekt však zostane nezmenený.
K tejto téme sa ešte vrátime v kurze Objektovo orientovaného programovania v Pythone.
Číselné dátové typy
V Pythone sa číselné dátové typy využívajú na reprezentáciu a manipuláciu s číselnými hodnotami.
Dátový typ int
Tento typ už pomerne dobre poznáme. V Pythone reprezentuje celé
čísla, teda čísla bez desatinných miest. Významným rysom typu
int v Pythone je jeho flexibilita v porovnaní s
celočíselnými dátovými typmi v niektorých iných programovacích jazykoch.
V nich je celé číslo často obmedzené svojím rozsahom na základe bitov,
ktoré sú pre neho alokované (napr. 32 bitmi alebo 64 bitmi). V Pythone však
nie je dĺžka čísla typu int pevne stanovená.
Namiesto toho je dynamicky rozširovaná podľa potreby, obmedzená je iba
dostupnou pamäťou systému. S typom int je možné vykonávať
bežné matematické operácie ako sčítanie, odčítanie, násobenie a
delenie. Python ďalej poskytuje operácie ako modulo (zvyšok po delení) a
celočíselné delenie:
x = 10
y = 3
print(x + y) # 13
print(x % y) # 1
print(x // y) # 3
V predchádzajúcej ukážke sme použili %. Na
slovenskej klávesnici ho píšeme pomocou Ľavého SHIFT a
nasledujúce klávesy:

V konzole vidíme výsledky:
Integer type:
13
1
3
V nasledujúcej ukážke použijeme podčiarknutie
_. Na slovenskej klávesnici ho píšeme pomocou Shift a
nasledujúceho znaku:

Zoznámili sme sa už aj s parsovaním. Ak je to však zmysluplné, typ
int tiež vie na seba prevádzať iné dátové typy:
float_num = 3.9
int_num = int(float_num)
print(int_num)
V konzole vidíme výsledky:
Integer type:
3
Pokiaľ bude mať Python na zmysluplnosť našej snahy o prevod iného
dátového typu na int iný názor ako my, informuje nás o tom
chybovou hláškou:
Integer type:
ValueError: invalid literal for int()
Dátové typy float a
Decimal
Zatiaľ čo typ int reprezentuje celé čísla, typy
float a Decimal v Pythone slúžia na reprezentáciu
desatinných čísel. Hoci oba typy zastupujú desatinné čísla, majú rôzne
vlastnosti a využitie.
Dátový typ float
Typ float je dátový typ zastupujúci čísla s plávajúcou
rádovou čiarkou. Je dôležité si uvedomiť, že čísla typu
float nemajú absolútnu presnosť v dôsledku obmedzenia hardvéru
a reprezentácie čísel. Môže to viesť (a často vedie) k drobným chybám
pri zaokrúhľovaní. Výstupom tohto kódu často nemusí byť
0.3:
print(0.1 + 0.2)
Namiesto toho sa niekedy dočkáme výsledku ako
0.30000000000000004.
Nedá sa presne povedať, ako často k tomu dôjde, pretože tento jav
závisí od konkrétnych čísel, s ktorými pracujeme. Niektoré čísla s
plávajúcou rádovou čiarkou môžu byť reprezentované presne, zatiaľ čo
iné nie. Problém s 0.1 + 0.2 je známy a často uvádzaný
príklad.
Číslo typu float získame aj pomocou exponenciálnej
notácie:
b = 2.71e-5 # which is 0.0000271
Dátový typ Decimal
Zatiaľ čo typ float je navrhnutý pre rýchle
výpočty, typ Decimal je navrhnutý pre presné
výpočty. Je obzvlášť vhodný pre finančné a monetárne
aplikácie, kde je potrebná maximálna presnosť. Je navrhnutý tak, aby
minimalizoval chyby pri zaokrúhľovaní a poskytoval presné
výsledky, a to aj v prípadoch, keď môže float zlyhať:
V nasledujúcej ukážke použijeme apostrof. Apostrof napíšeme pomocou klávesu Shift a klávesu, ktorý sa nachádza pod klávesom Backspace:

Ukážka použitia dátového typu Decimal je nasledujúca:
from decimal import Decimal a = Decimal('0.1') b = Decimal('0.2') total = a + b print(total) # returns exactly 0.3
Hoci máme možnosť zabudnúť na float a pre istotu vždy
voliť Decimal, je dôležité vybrať ten správny typ na základe
požiadaviek aplikácie:
floatpre rýchle výpočty,Decimalpre situácie, kde je potrebná maximálna presnosť.
Dátový typ bool
Premenné boolean, ktoré v Pythone reprezentuje typ bool,
umožňujú uložiť len dve hodnoty – True a
False. Ukážme si to na nasledujúcom príklade.
V nasledujúcej ukážke použijeme znak >. Na
slovenskej klávesnici píšeme > a < pomocou
Pravého ALT a nasledujúcich klávesov:

Príklad je nasledujúci:
b = False
expression = 15 > 5
print(b)
print(expression)
Výstup programu je nasledujúci:
Logical expressions:
False
True
Výraz platí, teda je rovný True, pretože 15 je viac
ako 5. Prejsť z výrazov k podmienkam je síce len malý krôčik, my
sa ale podmienkam budeme venovať až neskôr.
Dátový typ complex
V Pythone je dátový typ complex určený na reprezentáciu
komplexných čísel. Komplexné čísla majú reálnu a imaginárnu časť a v
matematike sa často reprezentujú v tvare a + bi, kde
a je reálna časť, b je imaginárna časť a
i je imaginárna jednotka. V Pythone je imaginárna jednotka
reprezentovaná písmenom j. Vytvoriť sa dá dvoma spôsobmi:
complex_number1 = 3 + 4j complex_number2 = complex(3, 4) # both notations are equivalent
Operácie s komplexnými číslami presahujú hranice nášho kurzu, preto si
ich tu uvádzame iba v základnej podobe ako informáciu, že v Pythone
existujú. Pre komplexné čísla má Python modul cmath, ktorý
obsahuje mnoho užitočných funkcií pre prácu s komplexnými číslami,
napríklad pre výpočet magnitúdy, fázového uhla alebo komplexného
odmocnenia.
Dátový typ Fraction
Dátový typ Fraction v Pythone umožňuje pracovať s
racionálnymi číslami, t. j. číslami reprezentovanými zlomkami. Je
súčasťou modulu fractions a je obzvlášť užitočný v
situáciách, kedy je potrebné zachovať presnú hodnotu výpočtu bez
zaokrúhľovania, čo je nám už známy problém pri float
číslach. Na vytvorenie zlomku použijeme dve celé čísla (čitateľ a
menovateľ):
from fractions import Fraction fraction = Fraction(3, 4) # represents the fraction 3/4
Pokiaľ zadáme zlomok, ktorý je možné krátiť, Python to urobí automaticky:
fraction = Fraction(6, 8) # will automatically be reduced to 3/4
Rovnako ako s celými číslami alebo číslami s plávajúcou rádovou čiarkou, aj pri zlomkoch máme k dispozícii všetky základné aritmetické operácie:
a = Fraction(3, 4) b = Fraction(1, 3) result = a + b # addition of fractions 3/4 + 1/3
A nakoniec zlomok ľahko prevedieme na desatinné číslo:
fraction = Fraction(1, 3) float_value = float(fraction)
To je na dnes všetko 
V nasledujúcej lekcii, Textové reťazce v Pythone, nás čakajú reťazce v Pythone.
