2012-02-29 89 views
15

假設我有一堆變量是TrueFalse。我要評價一組在這些變量之一if語句,看看他們都False像這樣:在一個'if'語句中評估多個變量?

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

除了不起作用。我知道我能做到這一點:

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

但是,這是相當難看 - 尤其是如果這些if語句將要發生了很多我的代碼。有沒有什麼方法可以用更簡潔的語法來進行評估(如第一個例子)?

回答

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

'沒有任何(...)'是爲「全部假」情況做Pythonic的方法,'all(...)'是爲「全部爲真」的情況。 – 2012-02-29 18:39:13

+0

好,完整的答案。 – 2012-02-29 21:49:37

+0

'任何((var1,var2,var3,var4))'表示所有將被評估,無論如果你使用的是昂貴的函數將是相當低效的,而相反擊敗任何和短路的目的 – 2015-12-06 20:06:24

0

您可以使用if var1 == var2 == var3 == False:

3

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

這是對 「全是假的」 分支。對於「所有的真實」,只要做if all((var2, var2, var3, var4)):

+7

所有false都可以縮寫爲:'如果沒有((var1,var2,var3,var4)):' – soulcheck 2012-02-29 18:35:23

+0

@soulcheck您需要將參數放入一個迭代器中。'any'只有一個參數。 – 2012-02-29 18:37:28

+0

@ Series8217 thx糾正 – soulcheck 2012-02-29 18:39:23

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() 

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

使用any()關鍵字。