Pregunta

¿Soporta Python cortocircuito en expresiones booleanas?

¿Fue útil?

Solución

Sí, tanto and y operadores or cortocircuito - ver los docs .

Otros consejos

comportamiento

El cortocircuito en and operador, or:

Vamos a definir primero una función útil para determinar si se ejecuta o no algo. Una simple función que acepta un argumento, imprime un mensaje y devuelve la entrada, sin cambios.

>>> def fun(i):
...     print "executed"
...     return i
... 

Se puede observar cortocircuitos del de Python comportamiento de and, los operadores or en el siguiente ejemplo:

>>> fun(1)
executed
1
>>> 1 or fun(1)    # due to short-circuiting  "executed" not printed
1
>>> 1 and fun(1)   # fun(1) called and "executed" printed 
executed
1
>>> 0 and fun(1)   # due to short-circuiting  "executed" not printed 
0

Nota: Los siguientes valores son considerados por el intérprete en false media:

        False    None    0    ""    ()    []     {}
comportamiento

El cortocircuito de la función: any(), all():

any() y funciones all() también apoyan cortocircuitos. Como se muestra en la documentación; evalúan cada elemento de una secuencia en orden, hasta encontrar un resultado que permite una salida temprana en la evaluación. Considere los ejemplos siguientes para entender ambos.

La función any() comprueba si cualquier elemento es True. Se deja de ejecutarse en cuanto se encuentre un Verdadero y devuelve verdadero.

>>> any(fun(i) for i in [1, 2, 3, 4])   # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])   
executed                               # bool(0) = False
executed                               # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True

La función all() comprueba todos los elementos son True y deja de ejecutarse como pronto como se detecta un falso:

>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False
comportamiento

El cortocircuito en encadenada Comparación:

Además, en Python

  

Las comparaciones se pueden encadenar arbitrariamente ; por ejemplo, x < y <= z es equivalente a x < y and y <= z, excepto que se evalúa y sólo una vez (pero en ambos casos z no se evalúa en absoluto cuando x < y se encuentra que es falsa).

>>> 5 > 6 > fun(3)    # same as:  5 > 6 and 6 > fun(3)
False                 # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3)    # 5 < 6 is True 
executed              # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7)   # 4 <= 6 is True  
executed              # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3    # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False

Editar
Un punto más interesante nota - Lógico and, los operadores or en Python devuelve valor de un operando en lugar de un valor booleano (True o False). Por ejemplo:

  

Operación x and y da la if x is false, then x, else y resultado

A diferencia de en otros idiomas, por ejemplo, &&, los operadores || en C que el retorno o bien 0 o 1.

Ejemplos:

>>> 3 and 5    # Second operand evaluated and returned 
5                   
>>> 3  and ()
()
>>> () and 5   # Second operand NOT evaluated as first operand () is  false
()             # so first operand returned 

retorno operador mismo modo or dejó la mayor valor para el que bool(value) == True otro valor derecho más falsa (de acuerdo con el comportamiento de corto circuito), los ejemplos:

>>> 2 or 5    # left most operand bool(2) == True
2    
>>> 0 or 5    # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()

Entonces, ¿cómo es esto útil? Un ejemplo de uso dado en Práctico Por Python Magnus Lie Hetland:
Digamos que un usuario se supone que debe introducir su nombre, pero pueden optar por ingresar nada, en cuyo caso se desea utilizar la '<unknown>' valor predeterminado. Se podría utilizar un if, pero también podría decir las cosas de manera muy sucinta:

In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name: 

In [172]: name
Out[172]: '<Unkown>'

En otras palabras, si el valor de retorno de raw_input es verdad (no es una cadena vacía), que es cedidad para el nombre (nada cambia); de lo contrario, el '<unknown>' por defecto se asigna a name.

Sí. Pruebe lo siguiente en el intérprete de Python:

y

>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero

o

>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top