IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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 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 více teoretický, podíváme se důkladněji na datové typy a vysvětlíme si, kdy jaký 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 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ě adresu na svá 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 = "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 se více proměnných měnilo, když je změněna jedna z 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 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 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í. Dále Python 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

V konzoli vidíme výsledky:

Typ int:
13
1
3

Už jsme se také seznámili s parsováním. Typ int ale umí, pokud je to smysluplné, také převádět na sebe 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í hardware a reprezentace čísel. Může to vést (a často vede) k malý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 to 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:

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ý na základě požadavků aplikace:

  • float pro rychlé výpočty
  • a 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 následujícím příkladu:

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, kde 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

Se zlomky máme k dispozici všechny základní aritmetické operace, stejně jako s celými čísly nebo čísly s plovoucí řádovou čárkou:

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.


 

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