Další Předchozí Obsah

3. Typy v Pythonu

3.1 Prázdný typ

Speciálním typem je prázný typ, který může mít jedinou hodnotu a to None. Tuto hodnotu vrací například funkce, které nic nevrací (pokud explicitně nevrací None :-). Hodnota None se nerovná ničemu jinému, než sama sobě.

3.2 Numerické typy

Python zná a povoluje používat několik číselných typů.

Pokud číslo neobsahuje desetinnou tečku, Python předpokládá, že jde o celé číslo (int). Výsledek aritmetické operace nad celými čísly je zase celé číslo, tedy například podmínka 5/2==2 je vždy pravdivá! Velikost celého čísla je omezena použitým kompilátorem C, obvykle odpovídá typu longint (pro procesory i386 od -2147483648 do 2147483647).

Dlouhá čísla (long) se vyznačují postfixem l nebo L. Jsou také celá, jejich velikost je omezena pouze velikostí paměti počítače. Výpočty nad nimi jsou poněkud pomalejší. O výsledcích platí totéž, co pro celá čísla.

Čísla v plovoucí řádové čárce (float) se vyznačují tím, že v zápise mají desetinnou tečku. Nejsou samozřejme přesná. (I když jde o čísla racionální a ještě ne všechna, říká se jim reálná. Budu to také dělat a předem se za to omlouvám.)

Komplexní čísla (complex) - komplexní jednotka se zapisuje j, před písmenem j musí být platné reálné číslo. (Už je to tady.)

Pro převod mezi čísly existují funkce int, long, float a complex.

Typ libovolného výrazu je možné zjistit pomocí vestavěné funkce type.

>>> type(10)
<type 'int'>
>>> type(10/3)
<type 'int'>
>>> type(10/3.)
<type 'float'>
>>> type(2L)
<type 'long int'>
>>> type(2j+4)  
<type 'complex'>
>>> type('2')  
<type 'string'>

3.3 Řetězce

Python samozřejmě umí pracovat i s řetězci. Řetězce se zadávají buď v uvozovkách nebo apostrofech podle toho, co se zrovna více hodí. Pokud je potřeba, lze řetězec začít třemi uvozovkami (či apostrofy), potom se za konec řetězce považuje ta samá sekvence. Řetězce mohou překračovat hranice řádků.

V řetězci je možné používat obvyklé escape znaky používané v C (\' jako apostrof, \" uvozovky, \\ lomitko, \n LF a další).

>>> "Toto je retezec"
'Toto je retezec'
>>> 'A toto je retezec s "uvozovkami"'
'A toto je retezec s "uvozovkami"'
>>> "A tento obsahuje 'apostrofy'"
"A tento obsahuje 'apostrofy'"
>>> """Velmi
... "dlouhy" retezec"""
'Velmi\012"dlouhy" retezec'
>>> '''A toto '"'"'"'"'"'"'"'"'"'" je hnusny retezec'''
'A toto \'"\'"\'"\'"\'"\'"\'"\'"\'"\'" je hnusny retezec'

K jednotlivým znakům je možné přistupovat pomocí operátoru index (hranaté závorky), přičemž znak na začátku řetězce má index 0. Přístup za konec řetězce vygeneruje výjimku IndexError.

ADVANCED: Jména výjimek je možné ignorovat do té doby, než o nich bude zmíněno pořádně.

>>> str = 'qwerty'
>>> str[1]
'w'

ADVANCED: Všimněte si, že Python při interaktivním sezení vypisuje texty v notaci, kterou je schopný zpětně načíst. Pro výpis v interaktivním režimu se používá operátor 'zpětný apostrof' (Existuje nějaký pěkný český překlad?)

3.4 Seznamy a n-tice

Dalšími datovými strukturami, která jsou v Pythonu k dispozici je seznam a n-tice (v angličtině list a tuple). N-tice je stejně jako v matematice uspořádané zobrazení z podmnožiny přirozených čísel do hodnot. Hodnotami v n-ticích mohou být jakékoliv objekty. Pro seznamy platí totéž, liší se pouze zápisem a časem zjistíme, že i chováním.

Seznamy se zapisují v hranatých závorkách, n-tice v obyčejných závorkách. Obsahuje-li n-tice více prvků, mohou být její závorky vynechané. K oběma strukturám se dá přistupovat pomocí indexů (opět pomocí hranatých závorek).

>>> l0 = []
>>> l1 = [1]
>>> l2 = [1, 2, 3, 4, 'retezec', None]
>>> t0 = ()
>>> t1a = (2,)
>>> t1b = (2)
>>> t2a = ("/dev/fd0", 2, 3)
>>> t2b = "/dev/fd0", 2, 3

l0 je prázdný seznam, l1 je seznam obshující jediný prvek a l2 obsahuje šest různých prvků. Čtvrtý z nich je řetězec a pátý je None (speciální hodnota).

t0 je 0-tice(?), t2a a t2b mají stejný obsah, kterým je uspořádaná trojice, nultým prvkem je řetězec, další dva jsou čísla. t1b vyhodnotil Python jako aritmetický výraz, jehož hodnota je 2. Oproti tomu t1a je 1-tice, nultým prvkem je číslo 2. Ano, rozdíl je v té čárce před poslední závorkou. Jak GvR píše v tutorialu: ``Je to škaredé, ale funguje to.''

Mezi seznamy a n-ticemi se převádí pomocí funkcí tuple a list.

3.5 Slovníky (hash)

Užitečnou datovou strukturou je slovník, v české terminologii se mu říká též asociativní pole (v anglické terminologii k Pythonu se používá opravdu termín dictionary, z jiných jazyků je znám jako hash). Zvenku se jeví jako pole, které nemusí být indexováno pomocí čísel, ale podle libovolných hodnot. Čas vyhledání či zjištění, že hledaný klíč neexistuje je v průměrném případě konstantní. [je to pravda?]

Data se od klíče oddělují dvojtečkou, jednotlivé položky se oddělují čárkami, všechno se to zavírá do složených závorek.

>>> h0 = {}
>>> h1 = { 'km': 'kilometr', 
...        3: 'tri',
...        None: 'nic' }
>>> h1[':-)'] = 'usmev'
>>> h1[3]
'tri'
>>> h1[None]
'nic'
>>> h1[':-)']
'usmev'
>>> del h1[3]
>>> h1[3] # zpusobi vyjimku
Traceback (innermost last):
  File "<stdin>", line 10, in ?
KeyError: 3

Slovníky mají několik užitečných metod, časem se dostanu k více z nich. Přístup neexistujícím klíčem způsobí výjimku KeyError.

ADVANCED: Přesněji: klíčem ve slovníku nemohou být libovolné objekty, ale pouze ty, které jsou nezměnitelné (immutable).


Další Předchozí Obsah