Что делает оператор caret ( ^ ) в Python?
сегодня я столкнулся с оператором caret в python и попробовал его, я получил следующий вывод:
>>> 8^3
11
>>> 8^4
12
>>> 8^1
9
>>> 8^0
8
>>> 7^1
6
>>> 7^2
5
>>> 7^7
0
>>> 7^8
15
>>> 9^1
8
>>> 16^1
17
>>> 15^1
14
>>>
похоже, он основан на 8, поэтому я предполагаю какую-то байтовую операцию? Я не могу найти много об этом поиске сайтов, кроме того, что он ведет себя странно для поплавков, у кого-нибудь есть ссылка на то, что делает этот оператор, или вы можете объяснить это здесь?
4 ответа:
Это побитовое XOR (исключающее ИЛИ).
его результат true, если один (и только один) из операндов (вычисляет) true.
продемонстрировать:
>>> 0^0 0 >>> 1^1 0 >>> 1^0 1 >>> 0^1 1
объяснить один из ваших собственных примеров:
>>> 8^3 11
подумайте об этом так:
1000 # 8 (binary) 0011 # 3 (binary) ---- # APPLY XOR ('vertically') 1011 # result = 11 (binary)
Он вызывает
__xor__()
или__rxor__()
метод объекта по мере необходимости, который для целочисленных типов делает побитовый exclusive-or.
Это побитовое исключающее ИЛИ. Двоичные побитовые операторы задокументированы в Глава 5 Ссылки на язык Python.
вообще говоря, символ
^
- это инфиксной версия__xor__
или__rxor__
методы. Любые типы данных, расположенные справа и слева от символа, должны реализовывать эту функцию совместимым образом. Для целых чисел это общееXOR
операция, но, например, нет встроенного определения функции для типаfloat
С типомint
:In [12]: 3 ^ 4 Out[12]: 7 In [13]: 3.3 ^ 4 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-13-858cc886783d> in <module>() ----> 1 3.3 ^ 4 TypeError: unsupported operand type(s) for ^: 'float' and 'int'
одна опрятная вещь о Python заключается в том, что вы можете переопределить это поведение в свой собственный класс. Например, в некоторых языках
^
символ означает возведение в степень. Вы могли бы сделать это таким образом, просто в качестве примера:class Foo(float): def __xor__(self, other): return self ** other
затем что-то вроде этого будет работать, а теперь, экземпляров
Foo
только на^
символ будет означать возведение в степень.In [16]: x = Foo(3) In [17]: x Out[17]: 3.0 In [18]: x ^ 4 Out[18]: 81.0