Lekce 5 - Typový systém podruhé - Datové typy v Pythonu
V předešlém cvičení, Řešené úlohy k 3.-4. lekci Pythonu, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Dnešní Python tutoriál bude teoretičtější, podíváme se důkladněji na datové typy a vysvětlíme si, kdy který použít. Na konci si ale i tak ukážeme nějaké příklady.
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 oproti některým programovacím jazykům, kde jsou hodnoty proměnných přímo uloženy v paměti.
Všechny proměnné v Pythonu interně uchovávají adresu svých dat 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 = "Python!"
s2 = s1
print(s1)
print(s2)
V konzoli uvidíme výstup:
Reference:
Python!
Python!
V ukázce výše je textový řetězec Python!
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 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.
Měnitelné a neměnitelné datové typy
Python rozlišuje dva druhy datových typů:
- měnitelné (mutable)
- a neměnitelné (immutable).
Nás budou zatím zajímat ty základní, které jsou neměnitelné.
Neměnitelné datové typy
Neměnitelné (immutable) typy mimo jiné zahrnují:
int
– celá čísla,float
– desetinná čísla,Decimal
– desetinná čísla s přesným výpočtem,bool
– logická hodnota (pravda/nepravda),str
– textový řetězec,Fraction
– zlomky ve tvaru čitatele a jmenovatele,complex
– komplexní čísla s reálnou a imaginární částí.
Bylo by matoucí, kdyby změna jedné z proměnných měnila více proměnných. Právě proto jsou základní datové typy v Pythonu neměnné:
s1 = "Tohle je původní text"
s2 = s1
s1 = "Tohle je nový text"
print(s1)
print(s2)
V konzoli vidíme výstup:
Neměnitelné typy:
Tohle je nový text
Tohle je původní text
Jakmile vytvoříme neměnitelný objekt (jako je např. řetězec), nemůžeme už jeho hodnotu měnit. Pokud provedeme nějakou akci, která by normálně změnila hodnotu řetězcové proměnné, Python vytvoří v paměti nový objekt a náš název proměnné bude odkazovat na tento nový objekt. Starý objekt však zůstane nezměněn.
K tomuto tématu se ještě vrátíme v kurzu Objektově orientovaného programování v Pythonu.
Číselné datové typy
V Pythonu se číselné datové typy využívají pro reprezentaci a manipulaci s číselnými hodnotami.
Datový typ int
Tento typ již poměrně dobře známe. V Pythonu reprezentuje celá
čísla, tedy čísla bez desetinných míst. Významným rysem typu
int
v Pythonu je jeho flexibilita v porovnání s
celočíselnými datovými typy v některých jiných programovacích jazycích.
V nich je celé číslo často omezeno svým rozsahem na základě bitů, které
jsou pro něj alokovány (např. 32 bity nebo 64 bity). V Pythonu však
není délka čísla typu int
pevně stanovena.
Místo toho je dynamicky rozšiřována podle potřeby, omezena je pouze
dostupnou pamětí systému. S typem int
lze provádět běžné
matematické operace jako sčítání, odečítání, násobení a dělení.
Python dále poskytuje operace jako modulo (zbytek po dělení) a celočíselné
dělení:
x = 10
y = 3
print(x + y) # 13
print(x % y) # 1
print(x // y) # 3
Pro ty, kteří nemohou klávesu % najít, na české klávesnici se nachází zde (nezapomeňte na Shift):
V konzoli vidíme výsledky:
Typ int:
13
1
3
V následující ukázce použijeme podtržítko. Na české klávesnici ho napíšeme pomocí klávesy SHIFT a následujícího znaku:
Už jsme se také seznámili s parsováním. Avšak pokud je to smysluplné,
typ int
také umí na sebe převádět jiné datové typy:
float_num = 3.9
int_num = int(float_num)
print(int_num)
V konzoli vidíme výsledky:
Typ int:
3
Pokud bude mít Python na smysluplnost naší snahy o převod jiného
datového typu na int
jiný názor než my, informuje nás o tom
chybovou hláškou:
Typ int:
ValueError: invalid literal for int()
Datové typy float
a
Decimal
Zatímco typ int
reprezentuje celá čísla, typy
float
a Decimal
v Pythonu slouží k reprezentaci
desetinných čísel. Přestože oba typy zastupují desetinná čísla, mají
různé vlastnosti a použití.
Datový typ float
Typ float
je datový typ zastupující čísla s plovoucí
řádovou čárkou. Je důležité si uvědomit, že čísla typu
float
nemají absolutní přesnost v důsledku omezení hardwaru a
reprezentace čísel. Může to vést (a často vede) k drobným
zaokrouhlovacím chybám. Výstupem tohoto kódu často nemusí být
0.3
:
print(0.1 + 0.2)
Místo toho se někdy dočkáme výsledku jako
0.30000000000000004
.
Nelze přesně říci, jak často k tomu dojde, protože tento jev závisí
na konkrétních číslech, se kterými pracujeme. Některá čísla s plovoucí
řádovou čárkou mohou být reprezentována přesně, zatímco jiná ne.
Problém s 0.1 + 0.2
je známý a často uváděný příklad.
Číslo typu float
získáme také pomocí exponenciální
notace:
b = 2.71e-5 # což je 0.0000271
Datový typ Decimal
Zatímco typ float
je navržen pro rychlé
výpočty, typ Decimal
je navržen pro přesné
výpočty. Je zvláště vhodný pro finanční a monetární aplikace,
kde je potřeba maximální přesnost. Je navržen tak, aby
minimalizoval zaokrouhlovací chyby a poskytoval přesné
výsledky, a to i v případech, kdy float
může selhat.
V následující ukázce použijeme apostrof. Na české klávesnici ho píšeme pomocí Shift a klávesy vedle Enter (u některých klávesnic je to klávesa nad Enter, u jiných před ním):
Ukázka použití datového typu Decimal
je následující:
from decimal import Decimal a = Decimal('0.1') b = Decimal('0.2') soucet = a + b print(soucet) # vrátí přesně 0.3
Přestože se nabízí zapomenout na float
a pro jistotu vždy
volit Decimal
, je důležité vybrat ten správný typ na základě
požadavků aplikace:
float
pro rychlé výpočty,Decimal
pro situace, kde je potřeba maximální přesnost.
Datový typ bool
Proměnné boolean, které v Pythonu reprezentuje typ bool
,
umožňují uložit jen dvě hodnoty – True
a
False
. Ukažme si to na příkladu.
V následující ukázce použijeme znak >
. Na
české klávesnici píšeme znaky >
a <
pomocí
Pravého ALT a následujících kláves:
Příklad je následující:
b = False
vyraz = 15 > 5
print(b)
print(vyraz)
Výstup programu je následující:
Logické výrazy:
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, my se ale podmínkám budeme věnovat až později v kurzu.
Datový typ complex
V Pythonu je datový typ complex
určený pro reprezentaci
komplexních čísel. Komplexní čísla mají reálnou a imaginární část a
v matematice se často reprezentují ve tvaru a + bi
, kde
a
je reálná část, b
je imaginární část a
i
je imaginární jednotka. V Pythonu je imaginární jednotka
reprezentována písmenem j
. Vytvořit se dá dvěma způsoby:
komplexni_cislo1 = 3 + 4j komplexni_cislo2 = complex(3, 4) # oba zápisy jsou ekvivalentní
Operace s komplexními čísly přesahují hranice našeho kurzu, proto si je
zde uvádíme pouze v základní podobě jako informaci, že v Pythonu
existují. Pro komplexní čísla má Python modul cmath
, který
obsahuje mnoho užitečných funkcí pro práci s komplexními čísly,
například pro výpočet magnitudy, fázového úhlu nebo komplexního
odmocnění.
Datový typ Fraction
Datový typ Fraction
v Pythonu umožňuje pracovat s
racionálními čísly, tj. čísly reprezentovanými zlomky. Je součástí
modulu fractions
a je zvláště užitečný v situacích, kdy je
potřeba zachovat přesnou hodnotu výpočtu bez zaokrouhlování, což je nám
už známý problém u float
čísel. Pro vytvoření zlomku
použijeme dvě celá čísla (čitatele a jmenovatele):
from fractions import Fraction zlomek = Fraction(3, 4) # reprezentuje zlomek 3/4
Pokud zadáme zlomek, který je možné zkrátit, Python to udělá automaticky:
zlomek = Fraction(6, 8) # bude automaticky zkráceno na 3/4
Stejně jako s celými čísly nebo čísly s plovoucí řádovou čárkou máme i se zlomky k dispozici všechny základní aritmetické operace:
a = Fraction(3, 4) b = Fraction(1, 3) vysledek = a + b # sčítání zlomků 3/4 + 1/3
A nakonec zlomek snadno převedeme na desetinné číslo:
zlomek = Fraction(1, 3) float_value = float(zlomek)
To je pro dnešní lekci vše
V příští lekci, Textové řetězce v Pythonu, nás čekají řetězce v Pythonu.