| ukotvit menu |
Operátory jsou různá znaménka a klíčová slova, pomocí kterých provádíme operace s datovými objekty. Možná to zní složitě, ale to asi všechny definice. Ukázka to objasní:
>>> 10 + 20 30
Operace součtu dvou čísel (datových objektů). Operátor je znaménko + (plus) a datové objekty 10 a 20 jsou operandy. To je jednoduché. Jaký bude výsledek operace záleží na datových typech operandů. To proto, že předchozí příklad se dá přepsat jako:
>>> (10).__add__(20) 30
To jest na volání metody __add__() datového objektu 10, které předáváme parametr datový objekt 20.
Poznámka pro experty:
Co se týče chování, můžeme oba příklady považovat za totožné. Ve skutečnosti ale produkují rozdílný bajtový kód:
>>> a = compile("(10).__add__(20)", "x", "exec")
>>> b = compile("(10)+(20)", "x", "exec")
>>> a.co_code
'd\x00\x00i\x00\x00d\x01\x00\x83\x01\x00\x01d\x02\x00S'
>>> b.co_code
'd\x00\x00d\x01\x00\x17\x01d\x02\x00S'
>>> import dis
>>> dis.disassemble(a)
1 0 LOAD_CONST 0 (10)
3 LOAD_ATTR 0 (__add__)
6 LOAD_CONST 1 (20)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 2 (None)
16 RETURN_VALUE
>>> dis.disassemble(b)
1 0 LOAD_CONST 0 (10)
3 LOAD_CONST 1 (20)
6 BINARY_ADD
7 POP_TOP
8 LOAD_CONST 2 (None)
11 RETURN_VALUE
>>> "a".__add__("b")
ab
>>> "a" + "b"
ab
Další velké téma je kombinace datových typů při operacích. To jest, když každý operand má jiný datový typ. Tato problematika je podrobně probraná v podkapitole Operace kapitoly Datové typy.
Pro některé operace operátory neexistují. Místo nich jsou k dispozici vestavěné funkce. Týká se to napříkad funkce abs(), která jakoby vrací absolutní hodnotu čísla. Ve skutečnosti poze volá metodu __abs__() u předaného datového objektu. Dotyčná metoda může dělat cokoli, ale u čísel skutečně vrací jejich absolutní hodnotu. U jiných datových typů není podporována. Můžete si ale klidně vytvořit vlastní datový typ, který ji bude implementovat.
+ - * ** / // % << >> & | ^ ~ < > <= >= == != <>
| operátor | metody | číslo | řetězec |
|---|---|---|---|
| x + y | __add__(), __radd__() | sčítání | spojení |
| x - y | __sub__(), __rsub__() | odčítání | |
| x * y | __mul__(), __rmul__() | násobení | speciální |
| x / y | __div__(), __rdiv__() | dělení | |
| x // y | __floordiv__(), __rfloordiv__() | dělení se zaokrouhlením dolů | |
| x ** y | __pow__(), __rpow__() | umocňování (x na y) | |
| x % y | __mod__(), __rmod__() | modulo | formátování |
| -x | __neg__() | unární mínus | |
| +x | __pos__() | unární plus | |
| x << y | __lshift__(), __rlshift__() | posun vlevo (jen celá čísla) | |
| x >> y | __rshift__(), __rrshift__() | posun vpravo (jen celá čísla) | |
| x & y | __and__(), __rand__() | bitové and (jen celá čísla) | |
| x | y | __or__(), __ror__() | bitové or (jen celá čísla) | |
| x ^ y | __xor__(), __rxor__() | bitové xor (jen celá čísla) | |
| ~x | __invert__() | bitová negace | |
| abs(x) | __abs__() | absolutní hodnota | |
| divmod(x,y) | __divmod__(), __rdivmod__() | vrací (int(x/y), x%y) | |
| x += y | __iadd__() | x = x + y | |
| x -= y | __isub__() | x = x - y | |
| x *= y | __imul__() | x = x * y | |
| x /= y | __idiv__() | x = x / y | |
| x //= y | __ifloordiv__() | x = x // y | |
| x %= y | __imod__() | x = x % y | |
| x **= y | __ipow__() | x = x ** y | |
| x &= y | __iand__() | x = x & y | |
| x |= y | __ior__() | x = x | y | |
| x ^= y | __ixor__() | x = x ^ y | |
| x <<= y | __ilshift__() | x = x && y | |
| x >>= y | __irshift__() | x = x >> y | |
| x < y | __lt__() | porovnání menší než | |
| x <= y | __le__() | porovnání menší nebo rovno | |
| x > y | __gt__() | porovnání větší než | |
| x >= y | __ge__() | porovnání větší nebo rovno | |
| x == y | __eq__() | porovnání rovná se | |
| x != y | __ne__() | porovnání nerovná se | |
| x in s | __contains__() | ||
| x is y | ____(), ____() | ||
| x and y | ____(), ____() | ||
| x or y | ____(), ____() | ||
| x not y | ____(), ____() | ||
| x(...) | ____(), ____() | ||
| x[...] | ____(), ____() | ||
| x.y | ____(), ____() | ||
| [...] | ____(), ____() | ||
| (...) | ____(), ____() | ||
| "..." | ____(), ____() | ||
| '...' | ____(), ____() | ||
| x=y | ____(), ____() | ||