2010-11-29 9 views
9

Por ejemplo:python expresión booleana no "cortocircuito"?

def foo(): 
    print 'foo' 
    return 1 
if any([f() for f in [foo]*3]): 
    print 'bar' 

pensé que el código anterior es la Salida:

foo 
bar 

en lugar de:

foo 
foo 
foo 
bar 

¿Por qué? ¿Cómo puedo hacer el efecto de "cortocircuito"?

+3

Respuesta corta: La lista de comprensión '[f() for f in [foo] * 3]' se ejecuta y crea una lista de valores de retorno 'f()' ** antes ** 'any()' tiene una posibilidad para evaluarlos (y cortocircuito). – martineau

+0

Duplicado. Por favor busca –

Respuesta

17

deconstruir su programa para ver lo que está sucediendo:

>>> [f() for f in [foo]*3] 
foo 
foo 
foo 
[1, 1, 1] 
>>> 

Ya está creando una lista y pasar a cualquiera y han impreso 3 veces.

>>> any ([1, 1, 1]) 
True 

Este se alimenta a si la declaración:

>>> if any([1, 1, 1]): 
...  print 'bar' 
... 
bar 
>>> 

Solución: Pase un generador a cualquier

>>> (f() for f in [foo]*3) 
<generator object <genexpr> at 0x10041a9b0> 
+0

+1 buena explicación. FTR 'any (f() para f en [foo] * 3)'. – aaronasterling

+0

¡Ideal para Python! Qué podría ser más simple que eso ! –

4

Se trata de crear la lista antes de pasarla a cualquier

tratar

def foo(): 
    print 'foo' 
    return 1 
if any(f() for f in [foo]*3): 
    print 'bar' 

de esta manera solo se crea una expresión de generador, por lo que solo se evalúan tantos términos como sea necesario.

Cuestiones relacionadas