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 | ____(), ____() |