6

在学习如何使用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"

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

第二个问题:上面的代码返回 3 行,这取决于 ifans实际上是在answeror中answer2。我试图通过像这样替换相关部分来消除它:

if ans in answer[i] == True:

这具有使代码仅输出else:语句的奇怪效果。if ans in answer[i]:那么任何人都可以向我解释python如何解释和之间的区别if ans in answer[i] == True:吗?

4

2 回答 2

15

要以相反的顺序回答您的问题,显式比较True对您不起作用的原因是 Python 没有按照您预期的方式解释表达式。Python 解析器对比较表达式有特殊处理,因此您可以将它们链接在一起并获得合理的结果,如下所示:

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

请注意,Python 必须将整个事情视为一个操作,因为如果将其分成两个操作,无论哪种方式都不会得到相同的结果:

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

它们的行为不同,因为括号中的部分首先被评估并返回True,但是True != "a"整个表达式返回 false。

根据权利,上述内容实际上根本不应该对您的程序产生任何影响。不幸的是,Pythonin通过相同的机制进行处理,==因此当您将它们链接在一起时,它们被解释为像上面这样的序列,因此 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)
于 2013-03-22T06:19:14.877 回答
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

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

作为旁注,通常认为显式检查Trueor的风格很差False- 最好简单地编写if x in y.

于 2013-03-22T06:13:28.643 回答