2013-03-22 44 views
6

在我学习如何使用in语句使if语句更好地工作的方式上,我写了一些不必要的复杂代码。代码片段后面有两个问题。python“in”语句自动返回为真

answer = ['Yes', 'yes', 'YES'] 
answer2 = ['No', 'no', 'NO'] 
ans = raw_input() 
for i in range(0, 3): 
    if ans in answer[i]: 
     print "Yes!" 
    elif ans in answer2[i]: 
     print "No!" 
    else: 
     print "Don't know what that means" 

第一个问题:我认为if n in listname:会自动返回True或False。有谁知道如果是这样的话?

第二个问题:上面的代码返回3行,这取决于ans实际上是否在answeranswer2中。我试图通过更换,像这样的相关部分,以消除:

if ans in answer[i] == True:

这不得不让代码只输出else:语句的奇效。那么有谁能向我解释python如何解释if ans in answer[i]:if ans in answer[i] == True:的区别?

回答

5

至于ans in answer[i]ans in answer[i] == True,简单的区别:Python之膨胀后一种形式中出来ans in answer[i] and answer[i] == True,这是当然的,因为假的字符串不等于True

一个简单的例子可以帮助说明这一点:

>>> a = [1, 2, 3] 
>>> 2 in a 
True 
>>> 2 in a == True 
False 
>>> 2 in a and a == True 
False 
>>> (2 in a) == True 
True 
>>> 2 in a == [1, 2, 3] 
True 
>>> 2 in a and a == [1, 2, 3] 
True 

注意如何添加括号改变的行为 - 这是类似于像1 < x < 5扩张,而不是(1 < x) < 5

作为一个方面说明,它通常被认为是不好的风格,以明确检查TrueFalse - 简单地写if x in y好多了。

15

要以相反的顺序回答您的问题,明确与True进行比较并不适合您的原因是,Python没有按照您预期的方式解释表达式。 Python的解析器比较表达式,这样就可以把它们结合在一起,并得到一个合理的结果,这样的特殊处理:

>>> "a" == "a" == "a" 
True 

注意,Python有处理这件事的一个操作,因为如果你把它分解为两个运算无论哪种方式,你没有得到相同的结果:

>>> ("a" == "a") == "a" 
False 
>>> "a" == ("a" == "a") 
False 

这些行为不同,因为在括号中的部分首先计算并返回True,但True != "a"所以整个表达式返回false。

通过权利,上述应该实际上不会对您的程序产生任何影响。不幸的是,Python的通过相同的机制,==所以当你链接这些他们一起被解释为一个序列像上述处理in,所以Python如下实际评价它:

>> "a" in ["a"] == True 
False 
>>> ("a" in ["a"]) and ("a" == True) 
False 

这是古怪的,可以说是反直觉的,但不幸的是它的工作原理。要获得的行为,你想你需要使用括号强制Python来单独评估第一部分:

>>> ("a" in ["a"]) == True 
True 

上面所有的内容表示,== True是多余的,因为,当你怀疑的表情已经返回boolean并且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)