2012-02-29 2 views
15

Скажем, у меня есть группа переменных, которые либо True, либо False. Я хочу, чтобы оценить набор этих переменных в одном, если заявление, чтобы увидеть, если они все False так:Оценить несколько переменных в одном выражении «если»?

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

Кроме того, что не работает. Я знаю, что могу это сделать:

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

Но это довольно некрасиво - особенно, если они если заявления будет происходить много в моем коде. Есть ли способ, которым я могу сделать эту оценку с помощью более чистого синтаксиса (например, первого примера)?

ответ

33

Вы должны never test a boolean variable with == True (or == False). Вместо этого, либо написать:

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

или использовать any (и связанных с ними проблем, его двоюродный брат all):

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

или использовать в Python transitive comparisons:

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

'not any (...)' - это метод Pythonic для этого случая «all False», а 'all (...)' для случая «all True». –

+0

Хорошо, полный ответ. –

+0

'any ((var1, var2, var3, var4))' означает, что все будут оцениваться независимо от того, что, если вы используете дорогие функции, будет довольно неэффективным и скорее победит цель любого и короткого замыкания –

0

Вы можете использовать if var1 == var2 == var3 == False:

3

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

Это для "всех" ложной ветви. Для «all true» просто сделайте if all((var2, var2, var3, var4)):.

+7

все ложные могут быть сокращены до: 'if not any ((var1, var2, var3, var4)):' – soulcheck

+0

@soulcheck Вам нужно поместить аргументы в итерируемое.'any' принимает только один аргумент. –

+0

@ Series8217 thx для коррекции – soulcheck

3

Вы можете сделать:

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

Как об этом:

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

или:

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

Это легко читать, поскольку они находятся в простом английском языке.

1

Как насчет пользовательской функции?

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

Теперь вы можете использовать его

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

Вы можете сделать:

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

Но, если переменные вычисляться истинным или ложным, вы также можете сделать это:

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

or

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

Используйте any() ключевое слово.

Смежные вопросы