Что делает оператор каретки (^) в Python?
Я столкнулся с оператором каретки в 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, так что я предполагаю какую-то операцию байта? Я не могу найти многого о таких поисковых сайтах, кроме того, что он ведет себя странно для float, есть ли у кого-нибудь ссылка на то, что этот оператор делает или вы можете объяснить здесь?
Ответы
Ответ 1
Это поразрядное XOR (эксклюзивное ИЛИ).
Это приводит к истинному, если один (и только один) из операндов (оценивается) 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)
Ответ 2
Он вызывает метод __xor__()
или __rxor__()
объекта по мере необходимости, который для целых типов выполняет побитовое исключение - или.
Ответ 3
Это побитовое исключение - или. Бинарные побитовые операторы документируются в главе 5 справочника по языку Python.
Ответ 4
Вообще говоря, символ ^
является infix версией методов __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