přihlásit 3629/513972

Operace s daty

S datovými objekty lze provádět různé operace. To jest nějak s nimi zacházet pomocí operátorů. Operace může být například matematická operace sečtení dvou čísel, kde jako operátor funguje znaménko + (plus). Ty dvě čísla pak nazýváme operandy. Každá operace vrací nějaký výsledek.

Operace ale nejsou jen matematické, je to například i porovnání dvou operandů na shodu nebo identitu a řada dalších. Python podporuje spoustu operátorů a podrobně se jim věnuji v kapitole operátory.

Pro operace platí dvě základní pravidla.

Celý zbytek kapitoly se zabývá vysvětlením těchto dvou pravidel. Možná že zněla složitě, ale příklady je snadno osvětlí.

>>> print 10 + 5
15

To je operace sečtení čísel 10 a 5. Oba operandy mají typ int. Datový typ int podporuje operátor + i typ int jako druhý operand. Výsledkem operace je nový datový objekt typu int, jehož hodnotou je součet obou čísel.

>>> print "abc" + "def"
abcdef

To je operace sečtení dvou řetězců. Oba operandy mají typ str. Datový typ str podporuje operátor + i typ str jako druhý operand. Výsledkem operace je nový spojený řetězec.

>>> print 10 + "abc"
Traceback (most recent call last):
  File "", line 1, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Toto je operace sečtení čísla a řetězce. První operand má typ int, druhý str. Datový typ int podporuje operátor +, ale nepodporuje jako druhý operand řetězec.

Při pokusu o sečtení čísla a řetězce je proto vyvolána výjimka. Protože výjimka nebyla zachycena, Python přerušil program a vypsal chybové hlášení. Hlásí že se jedná o chybu v použití datových typů (TypeError), a že jsme se pokusili o nepodporovanou operaci sečtení datového typu int a str.

To znamená, že kombinovat dva různé datové typy můžeme jen tehdy, když první operand podporuje pro příslušnou operaci datový typ druhého operandu. Jak jsme viděli, datový typ int nepodporuje jako druhý operand datový typ str. Ale pozor, to platí jen pro operaci sčítání, nic to nevypovídá o ostatních operacích. Například násobení čísla a řetězce možné je:

>>> print 3 * "abc"
abcabcabc

Hvězdička je operátor pro násobení. Operace násobení čísla a řetězce vede k tomu, že řetěze se znásobí. V našem případě se ztrojnásobil.

Je tedy nutno vědět, které operátory datové typy podporují a jaké datové typy mohou stát na straně druhého operandu. To jest, je potřeba znát vlastnosti jednotlivých datových typů. To je jedny ze základních znalostí programátora v Pythonu. V zásadě ale platí, že kombinovat různých datových typů jsou spíše výjimečné.

Tedy záleží i na operátoru, třeba operátor porovnávání ==, který zjišťuje, zda mají operandy stejnou hodnotu, umožňuje porovnávat dva libovolné datové typy. Exaktně řečeno, všechny datové typy umožňují, aby jako druhý operand byl libovolný datový typ.

>>> print 5 == 10
False
>>> print 10 == 5
False
>>> print 10 == 10
True
>>> print "abc" == "ab"
False
>>> print "abc" == "abc"
True
>>> print 10 == "10"    
False

Operace porovnávání jako výsledek vrací hodnotu logická pravda (True) nebo nepravda (False), což jsou hodnoty datového typu bool! Všimněte si, že datový typ výsledku operace (bool) není stejný, jako jsou datové typy operandů. Datový typ výsledku operace je na datových typech operandů zcela nezávislý. Záleží to čistě na konkrétní implementaci příslušné operace.

Nepřehlédněte poslední příkaz, který potvrzuje, že Python číslo 10 nepovažuje za shodné s řetězcem 10.

Časem zjistíte, že jako programátoři nemusíte používat jen připravené datové typy, ale že si můžete vytvářet vlastní. A bude jen na vás, pro které operátory naprogramujete podporu a které datové typy jako druhý operand umožníte používat.