5. diel - Typový systém druhýkrát - Dátové typy v Pythone
V predchádzajúcom cvičení, Riešené úlohy k 3.-4. lekcii Pythona, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
Dnešný Python tutoriál bude teoretickejší, pozrieme sa dôkladnejšie 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 bity alebo 64 bity). 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 konzole vidíme výsledky:
Integer type:
13
1
3
Už sme sa tiež zoznámili s parsovaním. Avšak pokiaľ je to 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 použ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
zaokrúhľovacím chybám. 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 zaokrúhľovacie chyby a poskytoval presné
výsledky, a to aj v prípadoch, keď float
môže zlyhať:
from decimal import Decimal a = Decimal('0.1') b = Decimal('0.2') total = a + b print(total) # returns exactly 0.3
Hoci sa ponúka 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:
float
pre rýchle výpočty,Decimal
pre 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:
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
väčší ako 5. Prejsť z výrazov k podmienkam je síce len malý
krôčik, my sa ale podmienkam budeme venovať až neskôr v kurze.
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, tj čí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 a menovateľa):
from fractions import Fraction fraction = Fraction(3, 4) # represents the fraction 3/4
Pokiaľ zadáme zlomok, ktorý je možné skrá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 máme aj so zlomkami 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 pre dnešnú lekciu všetko
V budúcej lekcii, Textové reťazce v Pythone, nás čakajú reťazce v Pythone.