Что делает оператор 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 78

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