2010-03-16 11 views
71

mi sono imbattuto l'operatore punto di inserimento in pitone oggi e provarlo, ho ottenuto il seguente risultato:Cosa fa l'operatore di omissione (^) in 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 
>>> 

Sembra essere basato su 8, quindi sto cercando di indovinare una sorta di operazione di byte? Non riesco a trovare molto su questo sito di ricerca diverso da quello che si comporta in modo strano per i float, qualcuno ha un link a ciò che questo operatore fa o puoi spiegarlo qui?

+3

Per gli interi, stessa cosa che fa in C.^_- –

+8

FYI, dalla shell Python, è possibile digitare 'aiuto ('^')' – seth

+1

-1: Questo è completamente rivestita nella documentazione Python e la funzione di aiuto inclusa. Chiedere questa domanda qui è sciocco. –

risposta

109

È un bit per bit XOR (OR esclusivo).

Diventa vero se uno (e solo uno) degli operandi (valutato su) vero.

Per dimostrare:

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

Per spiegare uno dei tuoi esempi:

>>> 8^3 
11 

pensare in questo modo:

 
1000 # 8 (binary) 
0011 # 3 (binary) 
---- # APPLY XOR ('vertically') 
1011 # result = 11 (binary) 
+10

Un esempio un po 'più illustrativo potrebbe includere entrambi i numeri aventi '1' nel stesso bit per chiarire che '1 xor 1 = 0'. –

+1

Volevo aggiungere, puoi fare numeri binari digitando '0bX' dove X è il tuo binario. '0b0001',' 0b0010', ecc. Quindi, '0b1101^0b1110' darebbe' 0b0011' (o 3). – Jeff

+0

Penso che "Risulterà vero se uno (e uno solo) degli operandi (valutato come) vero". non è esatto, sarebbe la definizione di uno xor booleano –

37

Si richiama il metodo di __xor__() o __rxor__() l'oggetto in base alle esigenze, che per i tipi interi esegue un esclusivo bit per bit o.

+3

+1 per indicare cosa fa * veramente *, al di fuori dell'operazione intera. –

7

In generale, il simbolo ^ è una versione infix dei metodi __xor__ o __rxor__. Qualsiasi tipo di dati sia posizionato a destra ea sinistra del simbolo deve implementare questa funzione in modo compatibile. Per gli interi, è l'operazione comune XOR, ma per esempio, non esiste una definizione built-in della funzione per il tipo float con il tipo 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' 

Una cosa semplice di Python è che è possibile ignorare questo comportamento in una classe tutta tua. Ad esempio, in alcune lingue il simbolo ^ significa esponenziazione. Si potrebbe fare che in questo modo, proprio come un esempio:

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

Poi qualcosa come questo funziona, e ora, per le istanze di Foo solo, il simbolo ^ significherà elevamento a potenza.

In [16]: x = Foo(3) 

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

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

woah, era possibile? e potremmo probabilmente cambiare il funzionamento dell'operatore '+'? –

+0

Sì, questo è il modo in cui il simbolo '+' è in grado di fare un tipo di azione per 'list' (concatenazione) mentre si fa un altro tipo di azione (aggiunta matematica) per i tipi numerici. In tal caso, dovresti sovrascrivere i metodi '__add__' o' __radd__' nella tua classe. – ely

+1

Come nota a margine, la versione '__r * __' di questi (come '__rxor__' o' __radd__') sarà invocata dall'argomento che appare sul * lato destro * del simbolo infisso, e solo se la chiamata a la funzione per il simbolo della mano sinistra non funziona. Puoi pensare come 'try: left_hand_symbol .__ xor __ (right_hand_symbol); eccetto: right_hand_symbol .__ rxor __ (left_hand_symbol) ', ma' xor' può essere sostituito da uno qualsiasi degli operatori di infisso disponibili nel [Python Data Model] (http://docs.python.org/3.1/reference/datamodel.html? evidenziare = rlshift). – ely