přihlásit 3420/592339

Data a datové typy

Datový typ

V kapitole Hello World! se objevil pojem textový řetězec. Tento pojem je označení jednoho druhu dat. Python s daty pracuje ve formě datových objektů a každý druh dat má svůj druh datového objektu. Druh datového objektu je určen datovým typem objektu. O tom všem jste se mohli podrobněji dočíst v kapitole Datový model. Tato kapitola a její podkapitoly se věnují podrobně právě datovým typům.

Datové typy popisují druhy dat, se kterými umí programovací jazyk pracovat. Každý programovací jazyk rozlišuje své vlastní datové typy. Tyto mohou být více či méně podobné datovým typům z jiných jazyků. Základní druhy dat jsou textový řetězec a číslo.

Čísel se obvykle rozlišuje vícero druhů. V Pythonu je např. celé, dlouhé, desetinné a komplexní číslo. Jazyk C například nemá komplexní číslo, ale za to u celých čísel ještě rozlišuje, kolik zabárají místa v paměti počítače. Každý takto rozlišený druh čísla má samostatný datový typ.

Textový řetězec představuje obyčejný text. Python má dva druhy textových řetězců. Obyčejný, kde každý znak zabírá jeden bajt (max. 256 variant znaků) a moderní univerzální Unicode, který pokrývá všechny možné znaky.

V Pythonu 3 byly vypuštěny zastaralé jednobajtové řetězce a používá už jen univerzální Unicode řetězce.

Řada často užívaných datových typů má své literály. Literál je textový zápis hodnoty datováho typu, který umoňuje Pythonu rozpoznat o jaký datový typ se jedná a převést ho automaticky na příslušný datový objekt. To se hodí při psaní programů, protože nám to usnadňuje práci s daty.

literál datový typ Popis alternativní zápis
0 int celé číslo s hodnotou 0
0.0 float číslo s plovoucí čárkou a hodnotou 0 float(0)
0L long dlouhé číso s hodnotou 0 long(0)
0j complex komplexní číslo s hodnotou 0 complex(0, 0)
"0" str textový řetězec se znakem 0

V Pythonu 3 byl sloučen datový typ int a long v jeden, který se nazývá int a má vlastnosti obou. Literál pro datový typ long v něm už neexistuje a zápis 0L v něm vyvolá výjimku "SyntaxError: invalid syntax".

Jak je vidět, datové typy se u literárního zápisu rozlišují pomocí různých značek. Desetinná tečka je vcelku přirozená a intuitivní, u jiných si to musíme pamatovat. XXXJe nutno si uvědomit, že ty značky nejsou součástí hodnoty, jen určují její datový typ. Například u řetězce jsou ty uvozovky jen vnější obal, aby Python poznal, kde řetězec začíná a kde končí když čte program. Nejlépe to bude pochopitelné na příkladu. Příkaz:

>>> print 0, "0", 0L, 0.0, 0j
0 0 0 0.0 0j

Jak je vidět, příkaz print klidně vypisuje nekteré hodnoty bez literárních značek, výjimkou je číslo s plovoucí čárkou. Je to přizpůsobeno uživatelům našich programů, kterým je vcelku putna, jestli se jedná o nulu datového typu int nebo long nebo o znak 0 textového řetězce. To je čistě počítačová záležitost, kterou uživatelé nerozlišují. Desetinná čísla ale znají a zrovna tak jim nelze zatajit, že se jedná o imaginární složku komplexního čísla, to už by pro ně mohlo být zavádějící.

Takovéto jednoduché věci je dobré si zkoušet na interaktivní konzoli, viz. kapitola Interaktivní interpret.

Další literály čísel jsou uvedeny v popisu číselných soustav. Tyto literály neslouží k rozlišení datových typů, ale právě různých číselných soustav a všechny se převádí na datový objekt typu int.

Jestli nemáte s programování žádné zkušenosti a trápíte se otázkou, jaký je vlastně rozdíl mezi řetězcem "0" a číslem 0, tak velký. Čísla a řetězce jsou to různé datové typy, jsou různě uloženy v paměti, mají různé vlastnosti a Python s nimi různě zachází. Nejlépe to osvětlí další ukázka:

>>> print 10 + 10
20
>>> print "10" + "10"
1010

To byla ukázka různého zacházení s různými datovými typy.

Hlavní rozdíl mazi číslem a řetězcem je, jak jsou tyto data uložena v paměti počítače. Ve zkratce, číslo 10 je v paměti uloženo v binární podobě. Tedy jako kombinace jedniček a nul, která v dvojkové soustavě představuje hodnotu 10. Oproti tomu řetězec "10" je v paměti uložen jako posloupnost znaků "1" a "0". Přitom znak "1" je něco jiného než číslo 1. Znak "1" je např. číslo 49. Počítače totiž umí pracovat jenom s čísly. Znaky jsou proto v počítači řada očíslovaných obrázků (i obrázek jsou čísla, čísla součadnic a čísla barev). Vztah mezi obrázky znaků a jejich čísly, tj. k jakému číslu je přiřazen který obrázek, je stanoveno ASCII tabulkou, která definuje že obrázek znaku 1 má číslo 49.

Ale to už jsem příliš odbočil. Jestli jste to moc nepochopili, tak vás to nemusí trápit. Teď stačí si pamatovat, že jazyk Python rozlišuje různé datové typy, s kterými z nějakého důvodu i různě zachází.

Gordický uzel

Teď zbystřete mysl, budete to potřebovat. Jak víte, v Pythonu jsou všechny data včetně kódu datové objekty. Tedy i datový typ. A protože každý datový objekt má svůj datový typ, tak i datový typ má svůj datový typ. Ten se jmenuje se type.

Pro jistotu ještě jednou. Číslo 10 má datový typ int a datový typ int má datový typ type. Datový typ type má také datový typ type. Je datovým typem sama sebe a tedy je i instancí sama sebe:

>>> type(10)
<type 'int'>
>>> type(type(10))
<type 'type'>
>>> type(type(type(10)))
<type 'type'>

Máte-li pocit, že je to nepochopitelně zamotané, tak ani nečtěte dál. Datový typ type totiž není základní neboli kořenový typ. To je datový typ object, z kterého datový typ type odvozen. Přesto je datový typ type datovým typem datového typu object. Tedy datový typ datového typu object je jeho vlastní potomek. Důkaz:

>>> issubclass(type, object)
True
>>> type(object)
<type 'type'>

Nyní se můžete ponořit do hlubokých filozofických úvah, zda byla dřív slepice nebo vejce.

Datové typy a třídy

Původně neměla objektová implementace Pythonu nic společného s jeho podporou OOP a byly to na sobě nazávislé věci. Tedy ani datové typy a třídy neměly nic společného, kromě toho, že třída jako datový objekt měla svůj datový typ. To se vývojářům Pythonu nelíbilo a rozhodli se to napravait. Tak se stalo v Pythonu verze 2.2, kdy se v něm objevily třídy nového stylu (New Class Style). Od té doby jsou datové typy implemntovány jako třídy nového stylu. Díky tomu nyní můžete vytvářet vlastní datové typy a to i odvozené od těch stávajících. O třídách nového stylu se více dozvíte v části věnované objektově orientovanému programování.

Malá ukázka tvorby nového datového typu:

>>> class NovyTyp(object):
...     pass        vytvoření nového datového typu, který nic neumí
...
>>> type(NovyTyp)
<type 'type'>       důkaz že se jedná o datový typ
>>> nt = NovyTyp()  vytvoření instance nového datového typu
>>> type(nt)        
<class '__main__.NovyTyp'>  ukázka datového typu instance

To je na úvod všechno. Nepřehlédněte, že tato kapitola má řadu podkapitol, které obsahují spoustu dalších důležitých informací o datech a datových typech. Data jsou prostě to první i poslední o co v programech jde. Rozumět jak se s nimi zachází je proto vcelku důležité.


Parse error: syntax error, unexpected T_STRING in /web/htdocs2/wraithcz/home/www/python/data/sessions/sessions1.php on line 2