Frage Was macht der Caret-Operator (^) in Python?


Ich lief heute in Python über den Caret-Operator und probierte es aus, ich bekam folgende Ausgabe:

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

Es scheint auf 8 zu basieren, also vermute ich eine Art von Byte-Operation? Ich kann nicht viel über diese suchenden Aufstellungsorte finden, außer es verhält sich seltsam für Hin- und Herbewegungen, hat jemand einen Link zu, was dieser Bediener tut, oder können Sie es hier erklären?


76
2018-03-16 00:21


Ursprung


Antworten:


Es ist ein bisschen XOR (Exklusiv oder).

Es ergibt sich zu wahr wenn ein (und nur einer) der Operanden (ergibt sich) wahr.

Demonstrieren:

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1

Um eines Ihrer eigenen Beispiele zu erklären:

>>> 8^3
11

Denke darüber nach:

1000 # 8 (binär)
0011 # 3 (binär)
---- # APPLY XOR ('vertikal')
1011 # Ergebnis = 11 (binär)

116
2018-03-16 00:23



Es ruft das an __xor__() oder __rxor__() Methode des Objekts wie benötigt, die für Integer-Typen eine bitweise Exklusiv-Oder-Funktion ausführt.


37
2018-03-16 00:37



Es ist ein Bit-by-Bit Exklusiv-oder. Binäre bitweise Operatoren sind in dokumentiert Kapitel 5 der Python-Sprachreferenz.


12
2018-03-16 00:23



Im Allgemeinen das Symbol ^ ist ein Infix Version des __xor__ oder __rxor__ Methoden. Welche Datentypen rechts und links neben dem Symbol platziert werden, muss diese Funktion auf kompatible Weise implementieren. Für ganze Zahlen ist es das Gemeinsame XOR Operation, aber zum Beispiel gibt es keine eingebaute Definition der Funktion für den Typ float mit Typ 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'

Eine nette Sache über Python ist, dass Sie dieses Verhalten in einer eigenen Klasse überschreiben können. Zum Beispiel, in einigen Sprachen ^ Symbol bedeutet Exponentiation. Sie könnten das auf diese Weise tun, nur als ein Beispiel:

class Foo(float):
    def __xor__(self, other):
        return self ** other

Dann wird so etwas funktionieren, und jetzt, für Beispiele von Foo nur, das ^ Symbol bedeutet Potenzierung.

In [16]: x = Foo(3)

In [17]: x
Out[17]: 3.0

In [18]: x ^ 4
Out[18]: 81.0

7
2017-10-18 13:37