Saltar al contenido

¿Dónde se usan los caracteres de barra vertical y ampersand en Python?

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 asignas obj.__and__ = lambda x, y: ... entonces sigue siendo obj.__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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *