Datové typy

Deklarace proměnné

Jistě jste zvyklí z jiného programovacího jazyka deklarovat nějakou proměnnou s jejím typem (například char ch; v jazyce C).

Python je beztypový jazyk, čímž je míněno, že můžete do proměnné přiřadit jakýkoliv typ a až podle aktuálně přiřazené hodnoty Python určí, jak se má z danou proměnou zacházet. Názorně je to vidět na následujícím příkladu.

  1. >>> cislo=3
  2. >>> cislo/2
  3. 1.5
  4. >>> cislo//2
  5. 1
  6. >>> cislo="3"
  7. >>> cislo/3
  8. Traceback (most recent call last):
  9.   File "<pyshell#8>", line 1, in <module>
  10.     cislo/3
  11. TypeError: unsupported operand type(s) for /: 'str' and 'int'

Jak vidíte, do proměnné cislo se uložil na šestém řádku řetězec, ačkoliv na prvním řádku se uložilo celé číslo. Proměnná může za běhu programu měnit svůj datový typ!

Řetězec (anglicky string) má zkratku 'str', celé číslo (anglicky integer) má zkratku 'int'. Chyba říká, že dělení (reprezentované lomítkem) nepodporuje jako své operandy řetězec a celé číslo. (Podporuje například celé číslo a celé číslo, jak je ukázáno na druhém řádku).

V Pythonu před verzí 3.0 vracelo celočíselné dělení celé číslo. Takže 3/2 vrátilo 1 a ne 1.5. Pokud chcete celočíselný výsledek, použijte místo jednoho lomítka lomítka dvě (jak je vidět na řádce 4). PS: operátor // výsledek zaokrouhluje vždy „dolů“, tj. např. 3//2 = 1 a -3//2 = -2..

Přístup k nevytvořené, nebo již zrušené proměnné způsobí chybu (NameError). Pozor na to, že Python je case-sensitive, tj. rozlišuje velká a malá písmena v názvech objektů (proměnných, funkcí atd.). Proměnná cislo není stejná, jako Cislo!

Základní datové typy

V tabulce je přehled základních datových typů Pythonu. Jejich podrobnější popis najdete v další kapitole.

Typ Název Příklady deklarace
Prázdný typ NULL x=None
Celé číslo integer x=3 nebo x=(3)
Celé dlouhé číslo long x=3l nebo x=3L
Racionální číslo float x=3.0
Komplexní číslo komplex x=2.0+3j nebo x=0j
Řetězce string x="a" nebo x='a'
Seznamy list x=[] nebo x=[3] nebo x=[4,5]
N-tice tuple x=(3,) nebo x=(3,6) nebo x=3,6
Sety set x={'jablko','hruska'}
Slovníky hash x={} nebo x={'tři':3,'čtyři':'4'}
V Pythonu verze 3 byl zrušen typ long a velikost typu int se zvětšila, takže teď zastupuje i hodnoty typu long. A tím se nám Python zase o něco zpomalil XD.
Všiměte si, že Python nemá datový typ pro znak (char). Místo toho prostě používejte string s jedním znakem.

Vyzkoušejte si deklarace proměnných a zjistěte jejich typ pomocí příkazu type():

>>> x=None
>>> type(x)
<type 'None'>
>>> x = 3.0
>>> type(x)
<class 'float'>
>>> x='a'
>>> type(x)
<type 'string'>

Základní datové operace

Hodnoty se přiřazují proměnným pomocí operátoru = (ne jako v Pascalu :=).
Výrazy se ukončují středníkem, nebo koncem řádku.

x = 1
y = x + 1; x = x + 1
print(x,y)              # vytiskne 2 2

V Pythonu je možné přiřadit jednu hodnotu naráz několika proměnným (stejně jako třeba v jazyce C).

>>> x = y = z = 4
>>> print(y)
4

V Pythonu je možné přiřadit jednu hodnotu naráz několika proměnným stejně jako třeba v jazyce C. Navíc je možné přiřadit jedním příkazem různé hodnoty s využitím tzv. n-tice (výrazy uzavřené v závorkách oddělené čárkou).

>>> x = y = z = 4
>>> print(y)
4
>>> (x,y,z) = (1,2,3)
>>> x, y, z
(1, 2, 3)
>>> y
2

S pomocí n-tic lze udělat ještě jedno mocné kouzlo (na to jsou pythonysti obvzláště hrdí). Můžete přehodit (swapovat) hodnoty dvou (i více) proměnných jedním příkazem, bez použití pomocné proměnné.

>>> x,y = 1, 2
>>> x,y
(1, 2)
>>> x,y = y,x
>>> x,y
(2, 1)
n-tice nemusí být vždy v závorkách. O n-ticích bude podrobněji řeč později.

Typ výsledku operace je dán operandy. To je patrné z následujícího příkladu:

>>> x = 3j # komplexní číslo
>>> y = 2  # celé číslo
>>> x/y  # výsledek je komplexní číslo
1.5j
>>> x=3
>>> x/y
1.5

Kromě příkazu přiřazení jsem tu už ukázal některé další (sčítání, dělení …). V tabulce je přehled aritmetických operací. Některé operátory lze aplikovat i na řetězce.

Název Operátor Příklad
plus + 3 + 2 # rovná se 5
"3" + "3" # rovná se "33"
mínus - 3 - 2 # rovná se 1
krát * 3 * 2 # rovná se 6
3 * "2" # rovná se "222"
mocnina ** 2 ** 4 # rovná se 16
děleno / 3 / 2 # rovná se 1.5
celočíselné dělení // 3 // 2 # rovná se 1
zbytek po dělení (modulo) % 8 % 3 # rovná se 2

Porovnávání výrazů (větší, menší, rovná se) je probráno až v kapitole True versus False.
Binární operátory jsou probrány v kapitole Vlastnosti datových typů.

Jmenný prostor

To nejlepší/nejtěžší jsem si nechal nakonec. Python si při běhu programu vytváří jmenné prostory, kam si ukládá jména proměnných, funkcí atd. Jmenných prostorů je více, vypsat si je můžete funkcí dir().

>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__']
>>> y
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    y
NameError: name 'y' is not defined
>>> y = 5
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', 'y']
>>> y
5

Jmenný prostor si můžete představit jako seznam názvů funkcí, proměnných, tříd atd.

Když Python hledá proměnnou nebo funkci, hledá jí nejdříve v lokálním jmenném prostoru (to je ten seznam, který vypíše dir()). Když jí nenajde, začne prohledávat další jmenné prostory, například '__builtins__' (zkuste si zadat příkaz dir(__builtins__) – najdete tam, mimo jiné, funkce print a dir).

V interaktivním režimu existuje kouzelná proměnná jménem _, která si pamatuje poslední vytištěnou hodnotu. Je součástí jmenného prostoru __builtins__.

Když se však do ní pokusíte přiřadit hodnotu, vytvoří se tím obyčejná proměnná jménem _ ve vašem lokálním jmenném prostoru, která si bude pamatovat hodnotu, kterou jste do ní přiřadili. Pokud se pak budete odvolávat na _, Python najde už tu ve vašem lokálním jmenném prostoru, takže se na tu v __builtins__ nedostanete. Jinak řečeno, vaše lokální hodnota má přednost. A tak to je se všemi jmény, nejen s _.

Python 3.3.1 (v3.3.1:d9893d13c628, Apr  6 2013, 20:30:21) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> x = 5
>>> _
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    _
NameError: name '_' is not defined
>>> x
5
>>> _
5
>>> x + 4
9
>>> _
9
>>> _ = "Hello world"
>>> _
'Hello world'
>>> x + 4
9
>>> _
'Hello world'

K jmenným prostorům se ještě dostaneme v kaptiole o vytváření funkcí – Lokální versus globální proměnné.

Odstranění jména z jmenného prostoru

Jakoukoliv proměnnou zrušíte příkazem del proměnná. Pokusíte-li se poté proměnou použít (například vytisknout její hodnotu funkcí print), dočkáte se chybového hlášení.

Proměnou můžete znovu deklarovat (a=3) a znovu vesele používat. Příkaz del může rušit několik proměnných najednou, jednotlivé proměnné se oddělují čárkou a ruší se v pořadí z leva do prava (někdy je to důležité vědět).

Lokální proměnné definované v těle bloku jsou rušeny automaticky po opuštění bloku.
Co je to tělo bloku, to probereme později.

Pokud se vrátíte zpět k příkladu s kouzelnou proměnnou _, která byla zastíněna lokální proměnnou _, pak příkazem del _ odstraníte lokální proměnnou a zase budete mít dostupnou tu kouzelnou.

Proměnné vs odkazy na proměnné

Pokud vytvoříte proměnnou, Python si do jmenného prostoru uloží informaci o typu proměnné, kde je uložena a jméno, které na tuto proměnnou ukazuje (funkce dir() vypisuje jen jména).

Pokud zadáte příkaz x = y, nevznikne tak nová proměnná zkopírováním hodnoty y a přiřazením jména x k této nové hodnotě, ale pouze se k proměnné y přiřadí další název! x a y sdílejí stejný paměťový prostor.

Nová proměnná se vytvoří přiřazením výrazu, který změní její hodnotu (např. x = y + 1).

Jednoznačný identifikátor proměnné (objektu) lze zjistit pomocí funkce id() .

>>> d = 0
>>> x = d
>>> id(d)
507098480
>>> id(x)
507098480
>>> x = d/2
>>> id(x)
32511896
Odkazy na seznam

Na to je třeba dát pozor, pokud pracujete s objekty.
Jedním takovým objektem je seznam:

  1. >>> a = [0]
  2. >>> b = a
  3. >>> a.append(3)
  4. >>> print(a)
  5. [0, 3]
  6. >>> print(b)
  7. [0, 3]
  8. >>> b = a + [5]
  9. >>> print(a)
  10. [0, 3]
  11. >>> print(b)
  12. [0, 3, 5]
  13. >>>

Na řádku 2 jsem jen přiřadil seznamu další jméno – b.
Na řádku 8 jsem vytvořil nový paměťový prostor a přiřadil mu jméno b.

Operátor is

Ke zjištění, zda jsou dva objekty totožné můžete použít operátor is.

Dva neměnné objekty (nelze změnit jejich hodnotu) mohou být totožné v případě, že obsahují stejná data. Python tak šetří paměť počítače, pokud to je možné. Ale nelze na to spoléhat, závísí to jen na vůli interpretu. Výsledky porovnání a a b v následujících příkladech mohou být s různými interprety Pythonu různé.

>>> a = 5
>>> b = 5
>>> a is b
True
>>> id(a)
507098640
>>> id(b)
507098640
>>> a = 257
>>> b = 257
>>> a is b
False
>>> c = [5]
>>> d = c
>>> c is d
True
>>> d = [5]
>>> c is d
False
Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 29.8.2015
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..