NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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):

Procento na české klávesnici - Základní konstrukce jazyka Python

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:

Podtržítko - Základní konstrukce jazyka Python

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):

Apostrof na české klávesnici - Základní konstrukce jazyka Python

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ě hodnotyTrue 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:

Větší menší - Základní konstrukce jazyka Python

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.


 

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í:
1451 hlasů
(^_^)
Aktivity