Ich bin heute in Python auf den Caret-Operator gestoßen und habe beim Ausprobieren die folgende Ausgabe erhalten:
>>> 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 Byte-Operation? Ich kann anscheinend nicht viel über diese Suchseiten finden, außer dass sie sich für Floats merkwürdig verhalten. Hat jemand einen Link zu dem, was dieser Operator tut, oder können Sie es hier erklären?
help('^')
**
, während sie nach dem Potenzierungsoperator suchen .help('^')
macht nichts in meinem Python 2.6.1 (Apple Build). @ S.Lott: Meinst du das ( docs.python.org/reference/… ), wenn du "vollständig abgedeckt" sagst?. Scheint ein bisschen spärlich für jemanden, der mit dem Konzept nicht vertraut ist ...Antworten:
Es ist ein bitweises XOR (exklusives ODER).
Es ergibt sich wahr, wenn einer (und nur einer) der Operanden wahr ist.
Demonstrieren:
Um eines Ihrer eigenen Beispiele zu erklären:
Denken Sie so darüber nach:
quelle
1
dasselbe Bit haben, um dies zu verdeutlichen1 xor 1 = 0
.0bX
wo X Ihre Binärzahl ist.0b0001
,0b0010
usw. Also,0b1101 ^ 0b1110
würde Ihnen0b0011
(oder 3) geben.Es ruft nach Bedarf die Methode
__xor__()
oder__rxor__()
des Objekts auf, die für ganzzahlige Typen ein bitweises Exklusiv-Oder ausführt.quelle
Es ist ein Stück für Stück exklusiv-oder. Binäre bitweise Operatoren sind in Kapitel 5 der Python-Sprachreferenz dokumentiert .
quelle
Im Allgemeinen ist das Symbol
^
eine Infix- Version der Methoden__xor__
oder__rxor__
. Unabhängig davon, welche Datentypen rechts und links vom Symbol platziert sind, muss diese Funktion auf kompatible Weise implementiert werden. Für Ganzzahlen ist dies die üblicheXOR
Operation, aber zum Beispiel gibt es keine integrierte Definition der Funktion für Typfloat
mit Typint
:Eine nette Sache an Python ist, dass Sie dieses Verhalten in einer eigenen Klasse überschreiben können. In einigen Sprachen
^
bedeutet das Symbol beispielsweise Exponentiation. Sie könnten dies auf diese Weise tun, nur als ein Beispiel:Dann wird so etwas funktionieren, und jetzt bedeutet das Symbol nur für Fälle von
Foo
^
Potenzierung.quelle
+
Operators ändern ?+
Symbol eine Art von Aktion fürlist
(Verkettung) ausführen, während eine andere Art von Aktion (mathematische Addition) für numerische Typen ausgeführt wird. In diesem Fall würden Sie die Methoden__add__
oder__radd__
in Ihrer Klasse überschreiben .__r*__
Version dieser (wie__rxor__
oder__radd__
) aus dem Argument auf der rechten Seite des Infix-Symbols aufgerufen , und zwar nur dann, wenn der Aufruf der Funktion für das linke Symbol nicht funktioniert. Sie können sich das so vorstellentry: left_hand_symbol.__xor__(right_hand_symbol); except: right_hand_symbol.__rxor__(left_hand_symbol)
, aber esxor
kann durch einen der verfügbaren Infix-Operatoren im Python-Datenmodell ersetzt werden .int
erstellen, der die Verkettung mit Zeichenfolgen ermöglicht? Mann, Python ist viel komplexer als ich dachte(CompositionA | CompositionB) // CompositionC
und es würde nur bedeuten "Komposition A spielen, gefolgt von Komposition B, während gleichzeitig parallel Komposition C spielen". Sprechen Sie über ein schönes Stück Code!Wenn Sie den
^
Operator verwenden, wird hinter den Vorhängen die Methode__xor__
aufgerufen.a^b
ist äquivalent zua.__xor__(b)
.Außerdem
a ^= b
entsprichta = a.__ixor__(b)
(wobei__xor__
als Ausweichlösung verwendet wird , wenn__ixor__
implizit über Verwendung aufgerufen wird ,^=
aber ist nicht vorhanden).Grundsätzlich
__xor__
liegt es an der Umsetzung. Häufige Anwendungsfälle in Python sind:Demo:
Demo:
Erläuterung:
quelle