为了以相反的顺序回答你的问题,明确地与True比较的原因并不适合你,因为Python没有按照你期望的方式解释表达式. Python解析器具有对比较表达式的特殊处理,因此您可以将它们链接在一起并获得合理的结果,如下所示:
>>> "a" == "a" == "a"
True
请注意,Python必须将整个事件视为一个操作,因为如果将它拆分为两个操作,则无法获得相同的结果:
>>> ("a" == "a") == "a"
False
>>> "a" == ("a" == "a")
False
这些行为有所不同,因为括号中的部分首先被计算并返回True,但是True!=“a”因此整个表达式返回false.
根据权利,上述内容实际上根本不会对您的程序产生任何影响.不幸的是,Python通过与==相同的机制处理,所以当你将它们链接在一起时,它们被解释为如上所述的序列,因此Python实际上按如下方式对其进行求值:
>> "a" in ["a"] == True
False
>>> ("a" in ["a"]) and ("a" == True)
False
这是古怪的,可以说是反直觉的,但遗憾的是它是如何运作的.要获得您想要的行为,您需要使用括号来强制Python分别评估第一部分:
>>> ("a" in ["a"]) == True
True
尽管如此,== True是多余的,因为正如您所怀疑的那样,表达式已经返回一个布尔值,而if语句只能按原样评估它.
现在回到你的另一个问题,我相信你要做的是取一行输入并根据用户输入的内容产生一个相应的输出行.您可以将in运算符应用于字符串和列表,以查看该字符串是否在列表中,这样您就可以完全消除for循环:
answer = ['Yes', 'yes', 'YES']
answer2 = ['No', 'no', 'NO']
ans = raw_input()
if ans in answer:
print "Yes!"
elif ans in answer2:
print "No!"
else:
print "Don't know what that means"
这首先测试输入是否与answer中的任何字符串匹配,然后对于answer2则相同.当然,您可以实现类似的效果,但也可以通过简单地将输入转换为小写并将其与小写形式进行比较来支持其他形式(如YeS):
if ans.lower() == "yes":
print "Yes!"
# (and so forth)