2012-02-29 49 views
15

Supongo que tengo un montón de variables que son True o False. Quiero evaluar un conjunto de estas variables en una sentencia if para ver si están todos False así:¿Evaluar múltiples variables en una declaración 'if'?

if var1, var2, var3, var4 == False: 
    # do stuff 

Excepto eso no funciona. Sé que puedo hacer esto:

if var1 == False and var2 == False and var3 == False and var4 == False: 
    # do stuff 

pero eso es bastante feo - especialmente si estos si las declaraciones se van a producir mucho en mi código. ¿Hay alguna forma de que pueda hacer esta evaluación con una sintaxis más limpia (como el primer ejemplo)?

Respuesta

33

Usted debe never test a boolean variable with == True (or == False). En su lugar, ya sea de escritura:

if not (var1 or var2 or var3 or var4): 

o utilizar any (y en los problemas relacionados con su primo all):

if var1 == var2 == var3 == var4 == False: 
+7

'not any (...)' es la manera Pythonic de hacerlo para el caso "all False", y 'all (...)' es para el caso "all True". –

+0

Bueno, respuesta completa. –

+0

'any ((var1, var2, var3, var4))' significa que todos serán evaluados, independientemente de que si estuviera usando funciones costosas sería bastante ineficiente y más bien derrota el propósito de cualquier y cortocircuito –

0

Puede utilizar if var1 == var2 == var3 == False:

3

if all(not v for v in (var1, var2, var3, var4)):

Eso es para el "todo falso" rama. Para "todo verdadero", simplemente haz if all((var2, var2, var3, var4)):.

+7

todo falso se puede acortar a: 'if not any ((var1, var2, var3, var4)):' – soulcheck

+0

@soulcheck Necesita poner los argumentos en un iterable.'any' toma solo un argumento. –

+0

@ Series8217 thx para la corrección – soulcheck

3

que puede hacer:

if var1 and var2 and var3 and var4: 
    do stuff 
7

¿Qué tal esto::

if not any((var1, var2, var3, var4)): 

o el uso de transitive comparisons Python

# if all are False 
if not any([var1, var2, var3, var4]): 
    # do stuff 

o:

# if all are True 
if all([var1, var2, var3, var4]): 
    # do stuff 

Estos son fáciles de leer, ya que están en la llanura Inglés.

1

¿Qué tal una función personalizada?

function ListObjectsEqualTo(myList, toValue): 
    for i in myList: 
     if i != toValue: 
      return False 
    return True 

Ahora usted puede utilizarlo

if ListObjectsEqualTo((var1, var2, var3, var4), False): 
    # do stuff 
1

que podría hacer:

if var1 == var2 == var3 == var4 == False: 
    do_stuff() 

Pero, si las variables se evalúan como verdadero o falso, también se puede hacer esto:

if var1 and var2 and var3 and var4: 
    do_stuff() 

O

if all([var1, var2, var3, var4]): 
    do_stuff() 
1
>>> not any([False, False]) 
True 
>>> not any([True, False]) 
False 
>>> 

Uso de la palabra clave any().

Cuestiones relacionadas