python"in"语句会自动返回true

Kev*_*vin 6 python python-2.7

我在学习如何使用in语句来使if语句更好地工作的过程中编写了一些不必要的复杂代码.我在代码片段后面有两个问题.

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"
Run Code Online (Sandbox Code Playgroud)

第一个问题:我认为if n in listname:自动返回True或False.有谁知道是否是这种情况?

第二个问题:上面的代码返回3行,这些行取决于if ans是否实际在answeranswer2.我试图通过更换相关部分来消除这种情况:

if ans in answer[i] == True:

这具有使代码仅输出else:语句的奇怪效果.因此,谁能向我解释如何蟒蛇解释之间的差异if ans in answer[i]:if ans in answer[i] == True:好吗?

Mar*_*ins 15

为了以相反的顺序回答你的问题,明确比较的原因True并不适合你,因为Python没有按照你期望的方式解释表达式.Python解析器具有对比较表达式的特殊处理,因此您可以将它们链接在一起并获得合理的结果,如下所示:

>>> "a" == "a" == "a"
True
Run Code Online (Sandbox Code Playgroud)

请注意,Python必须将整个事件视为一个操作,因为如果将它拆分为两个操作,则无法获得相同的结果:

>>> ("a" == "a") == "a"
False
>>> "a" == ("a" == "a")
False
Run Code Online (Sandbox Code Playgroud)

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

根据权利,上述内容实际上根本不会对您的程序产生任何影响.不幸的是,Python in通过相同的机制处理==,当你将它们链接在一起时,它们被解释为如上所述的序列,因此Python实际上按如下方式对其进行求值:

>> "a" in ["a"] == True
False
>>> ("a" in ["a"]) and ("a" == True)
False
Run Code Online (Sandbox Code Playgroud)

这是古怪的,可以说是反直觉的,但遗憾的是它是如何运作的.要获得您想要的行为,您需要使用括号来强制Python分别评估第一部分:

>>> ("a" in ["a"]) == True
True
Run Code Online (Sandbox Code Playgroud)

尽管如此,这== 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"
Run Code Online (Sandbox Code Playgroud)

这首先测试输入是否匹配任何字符串answer,然后相同answer2.当然,您可以实现类似的效果,但也支持其他形式,例如YeS只需将输入转换为小写并将其与小写形式进行比较:

if ans.lower() == "yes":
    print "Yes!"
# (and so forth)
Run Code Online (Sandbox Code Playgroud)


voi*_*hos 5

至于ans in answer[i]和之间的区别ans in answer[i] == True,简单:Python扩展后者的形式ans in answer[i] and answer[i] == True,当然,因为字符串不等于False 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
Run Code Online (Sandbox Code Playgroud)

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

作为旁注,通常认为显式检查的风格很差True或者False- 简单地编写它会好得多if x in y.