Сегодня я наткнулся на оператор каретки в 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, так что я предполагаю какую-то операцию с байтами? Я не могу найти много информации об этих поисковых сайтах, кроме того, что он ведет себя странно для поплавков, есть ли у кого-нибудь ссылка на то, что делает этот оператор, или вы можете объяснить это здесь?
help('^')
**
оператора возведения в степень.help('^')
ничего не делает в моем Python 2.6.1 (сборка для яблока). @ S.Lott: вы имеете в виду это ( docs.python.org/reference/… ), когда говорите «полностью покрыто»? Кажется немного скудным для тех, кто не знаком с этой концепцией ...Ответы:
Это побитовое XOR (исключающее ИЛИ).
Результатом является истина, если один (и только один) из операндов (оценивается как истина).
Демонстрировать:
Чтобы объяснить один из ваших примеров:
Подумайте об этом таким образом:
источник
1
тот же бит, чтобы прояснить это1 xor 1 = 0
.0bX
где X - ваш двоичный файл.0b0001
,0b0010
и т. д. Итак,0b1101 ^ 0b1110
дал бы вам0b0011
(или 3).При необходимости он вызывает метод объекта
__xor__()
or__rxor__()
, который для целочисленных типов выполняет побитовое исключающее ИЛИ.источник
Это побитовое исключающее ИЛИ. Бинарные побитовые операторы описаны в главе 5 Справочника по языку Python .
источник
Вообще говоря, этот символ
^
является инфиксной версией методов__xor__
или__rxor__
. Какие бы типы данных не помещались справа и слева от символа, эта функция должна реализовываться совместимым образом. Для целых чисел это обычнаяXOR
операция, но, например, нет встроенного определения функции для типаfloat
с типомint
:Одна из замечательных особенностей Python заключается в том, что вы можете переопределить это поведение в своем собственном классе. Например, в некоторых языках
^
символ означает возведение в степень. Вы можете сделать это так, в качестве одного примера:Потом что - то , как это будет работать, и теперь, за исключением случаев
Foo
только , то^
символ будет означать возведение в степень.источник
+
оператора?+
символ может выполнять одно действиеlist
(конкатенацию), а другое действие (математическое сложение) числовых типов. В этом случае вы должны переопределить методы__add__
или__radd__
в своем классе.__r*__
версия (например,__rxor__
или__radd__
) будет вызываться из аргумента, появляющегося в правой части инфиксного символа, и только если вызов функции для левого символа не работает. Вы можете думать об этом как оtry: left_hand_symbol.__xor__(right_hand_symbol); except: right_hand_symbol.__rxor__(left_hand_symbol)
, ноxor
его можно заменить любым из доступных инфиксных операторов в модели данных Python .int
объединять строки? чувак, питон намного сложнее, чем я думал(CompositionA | CompositionB) // CompositionC
и это будет просто означать: «Воспроизвести композицию A, а затем композицию B, при этом одновременно воспроизводя композицию C параллельно». Поговорим о красивом фрагменте кода!Когда вы используете
^
оператор, за кулисами__xor__
вызывается метод .a^b
эквивалентноa.__xor__(b)
.Кроме того,
a ^= b
эквивалентноa = a.__ixor__(b)
(где__xor__
используется как резервный вариант, когда__ixor__
неявно вызывается через using,^=
но не существует).В принципе, что
__xor__
есть, полностью зависит от его реализации. Распространенные варианты использования Python:Демо:
Демо:
Объяснение:
источник