我在学习如何使用 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 行,这取决于 ans
实际上是在 answer
还是 answer2
中。我试图通过像这样替换相关部分来消除它:
if ans in answer[i] == True:
这具有使代码仅输出 else:
语句的奇怪效果。那么谁能给我解释一下 python 如何解释 if ans in answer[i]:
和 if ans in answer[i] == True:
的区别?
最佳答案
为了以相反的顺序回答您的问题,明确比较 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
是多余的,因为正如您所怀疑的那样,表达式已经返回了一个 bool 值,而 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)
关于python - python "in"语句是否自动返回为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15563576/