2012-08-15 70 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