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.
- >>> cislo=3
- >>> cislo/2
- 1.5
- >>> cislo//2
- 1
- >>> cislo="3"
- >>> cislo/3
- Traceback (most recent call last):
- File "<pyshell#8>", line 1, in <module>
- cislo/3
- 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).
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) |
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'} |
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.
Vyzkoušejte si deklarace proměnných a zjistěte
jejich typ pomocí příkazu type()
:
>>> 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.
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).
>>> 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).
>>> 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)
Typ výsledku operace je dán operandy. To je patrné z následujícího příkladu:
>>> 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()
.
['__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 _.
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).
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()
.
>>> x = d
>>> id(d)
507098480
>>> id(x)
507098480
>>> x = d/2
>>> id(x)
32511896
Na to je třeba dát pozor, pokud pracujete s objekty.
Jedním takovým objektem je seznam:
- >>> a = [0]
- >>> b = a
- >>> a.append(3)
- >>> print(a)
- [0, 3]
- >>> print(b)
- [0, 3]
- >>> b = a + [5]
- >>> print(a)
- [0, 3]
- >>> print(b)
- [0, 3, 5]
- >>>
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é.
>>> 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