přihlásit 6078/609435

Operátory a výrazy

Co je to operátor a jak funguje

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

To co metoda __add__() nebo operátor provede a jaký vrátí výsledek je plně v kompetenci oné metody. Každý datový typ má tuto metodu naprogramovanou zvlášť, takže u každého datového typu může dělat něco jiného. Třeba u řetězců nedochází k jejich součtu ale spojení:

>>> "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.

Seznam operátorů

+       -       *       **      /       //      %
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=      <>
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 ____(), ____()

Parse error: syntax error, unexpected T_STRING in /web/htdocs2/wraithcz/home/www/python/data/sessions/sessions1.php on line 2