Este grupo de trabajo ha estado horas buscando respuestas a tus búsquedas, te dejamos la solución así que nuestro objetivo es serte de mucha apoyo.
Solución:
La página de wikipedia está mal, la he corregido. |
y &
no son operadores booleanos, aunque son operadores ansiosos, lo que significa que no son operadores de cortocircuito. Como probablemente sepa, así es como la pitón and
y or
los operadores trabajan:
>>> def talk(x):
... print "Evaluating: ", bool(x)
... return x
...
>>> talk(1 == 1) or talk(2 == 1) # 2 == 1 is not evaluated
Evaluating: True
True
>>> talk(1 == 1) and talk(2 == 1)
Evaluating: True
Evaluating: False
False
>>> talk(1 == 2) and talk(1 == 3) # 1 == 3 is not evaluated
Evaluating: False
False
Hasta donde yo sé, Python no tiene operadores booleanos entusiastas, tendrían que codificarse explícitamente, por ejemplo, así:
>>> def eager_or(a, b):
... return a or b
...
>>> eager_or(talk(1 == 1), talk(2 == 1))
Evaluating: True
Evaluating: False
True
Ahora a
y b
se evalúan automáticamente cuando se llama a la función, aunque or
todavía cortocircuitos.
En cuanto al uso de |
y &
, cuando se usan con números, son operadores binarios:
>>> bin(0b11110000 & 0b10101010)
'0b10100000'
>>> bin(0b11110000 | 0b10101010)
'0b11111010'
Es más probable que uses |
de esta manera con enlaces de python a bibliotecas que usan banderas, como wxWidgets:
>>> frame = wx.Frame(title="My Frame", style=wx.MAXIMIZE | wx.STAY_ON_TOP)
>>> bin(wx.MAXIMIZE)
'0b10000000000000'
>>> bin(wx.STAY_ON_TOP)
'0b1000000000000000'
>>> bin(wx.MAXIMIZE | wx.STAY_ON_TOP)
'0b1010000000000000'
Cuando se usan con conjuntos, hacen el intersección y Unión operaciones, respectivamente:
>>> set("abcd") & set("cdef")
set(['c', 'd'])
>>> set("abcd") | set("cdef")
set(['a', 'c', 'b', 'e', 'd', 'f'])
Algo que falta en las otras respuestas aquí es que &
y |
no tiene ningún significado universal en Python; su significado depende de los tipos de operandos, usando la magia __and__
y __or__
métodos. Dado que estos son métodos, los operandos se evalúan (es decir, sin cortocircuito) antes de pasarlos como argumentos.
Sobre bool
valores son lógico “y” y lógico “o”:
>>> True & False
False
>>> True | False
True
>>> bool.__and__(True, False)
False
>>> bool.__or__(True, False)
True
Sobre int
los valores son bit a bit “y” y bit a bit “o”:
>>> bin(0b1100 & 0b1010)
'0b1000'
>>> bin(0b1100 | 0b1010)
'0b1110'
>>> bin(int.__and__(0b1100, 0b1010))
'0b1000'
>>> bin(int.__or__(0b1100, 0b1010))
'0b1110'
En conjuntos, son intersección y unión:
>>> 1, 2 & 1, 3
1
>>> 1, 2 | 1, 3
1, 2, 3
>>> set.__and__(1, 2, 1, 3)
1
>>> set.__or__(1, 2, 1, 3)
1, 2, 3
Un par de notas extra:
- El
__and__
y__or__
los métodos siempre se buscan en la clase, no en la instancia. Así que si asignasobj.__and__ = lambda x, y: ...
entonces sigue siendoobj.__class__.__and__
eso es invocado. - El
__rand__
y__ror__
los métodos de la clase tendrán prioridad, si están definidos.
Consulte la referencia del lenguaje Python para obtener más detalles.
Significa que el operando izquierdo y el operando derecho siempre se evalúan. &
es el operador AND bit a bit y |
es el operador OR bit a bit.