2012-08-15 55 views
3

爲什麼這個不行:如何在python中創建OR語句?

  file = "v3a2" 
      if "v1" or "v2" in file: 
       v1.write(total) 
      elif "v3" in file: 
       print "never here?????" 

如何制定呢?

+0

非空字符串都在自己的「真實十歲上下的」,所以'如果「V1」'被返回true。 – 2012-08-15 22:53:07

+0

如果文件中的v1或文件中的v2工作 – jorrebor 2012-08-15 22:55:21

+0

要對發生的事情添加更多的說明:您的條件被解析爲if(「v1」)或(文件中的「v2」):...,並且每個Python中的對象具有某種真值。 – millimoose 2012-08-15 22:56:14

回答

9
 if "v1" or "v2" in file: 

相當於

 if ("v1") or ("v2" in file): 

這將永遠是True因爲bool("v1")==True

你可以說

 if any(x in file for x in ["v1", "v2"]): 

 if "v1" in file or "v2" in file: 

any版本看起來更好,如果有超過2或3項檢查

8

嘗試

if "v1" in file or "v2" in file: 

,而不是

if "v1" or "v2" in file: 

也許Python的Boolean Operations的審查可能會有所幫助。在摘要頁面的底部還有一個運算符優先級表。如果你諮詢的表格,你可以看到,自in運營商具有比or操作的優先級高,表達這樣解釋:

if ("v1") or ("v2" in file): 

,而不是你的預期/何意。

還要注意的是,如@ sepp2k下面有幫助的評論提到,如果or有更高的優先級比in,你的表現最終會爲if ("v1" or "v2") in file:也不會工作,你希望的方式。

這是直接鏈接到另一個table of operator precedence,因爲我找不到上述的一個。

+0

請注意,如果運算符優先級不同,它將被解析爲「if(」v1「或」 v2「)在文件中:',那還不能做OP想要的。所以這只是問題的一半。 – sepp2k 2012-08-15 23:24:06

+0

@ sepp2k是的,這是一個很好的觀點,謝謝你提到這一點。 – Levon 2012-08-15 23:25:37

+0

@ sepp2k我解釋了你的評論,並更新了我的答案,我希望你也可以(因爲不是每個人都閱讀所有評論)。 – Levon 2012-08-15 23:41:15