我有这段代码:
prefixes = "JKLMNOPQ"
suffix = "ack"
for letter in prefixes:
if letter in ("O", "Q"):
print letter + "u" + suffix
else:
print letter + suffix
它工作正常,但我有一个问题的理解。我认为:
if letter in ("O", "Q"):
创建带有2个字母的新元组:O和Q并检查是否存在值字母。
我不确定的是为什么这不能正常工作:
if letter == "O" or "Q":
此代码将“u”添加到所有前缀,而不仅仅是“O”和“Q”。
答案 0 :(得分:6)
所有这些都做同样的事情:
if letter == "O" or letter == "Q":
if letter in ("O", "Q"):
if letter in "OQ":
您的第if letter == "O" or "Q":
行评估为if (letter == "O") or "Q":
,"Q"
评估为True
,因此此表达式始终返回True
。
答案 1 :(得分:2)
平等比较优先于“或”运算符:http://docs.python.org/reference/expressions.html#summary
if letter == "O" or "Q":
成功
由于“Q”的计算结果为True,因此该if语句总是成功。
答案 2 :(得分:1)
if letter == "O" or "Q":
这可以改写为:
if (letter == "O") or ("Q"):
最后一部分,一个非空的字符串,总是计算为True
,因此整个表达式为True
。
所以你写得像这样:
if letter == "O" or letter == "Q":
或者使用你的元组代码(更好)。
答案 3 :(得分:1)
问题在于:
if letter == "O" or "Q":
应该是:
if letter == "O" or letter == "Q":
你将“u”添加到所有前缀的原因是因为“Q”始终为真。
答案 4 :(得分:1)
值得注意的是,即使优先权不同,它也行不通:
if letter == ("O" or "Q"):
这不好,因为"O"
是真实的*,所以"O" or "Q"
是“O”,所以我们只需将letter
与"O"
进行比较并忽略{完全{1}}。
在英语中,我们认为"Q"
是一个抽象概念,根据逻辑需要,它是"O" or "Q"
或"O"
的非确定性概念。然而,计算机处理确定的数量。我们最接近英语短语"Q"
(更确切地说,我们在它的时候):)是Is the letter "O" or "Q"?
我们可以将其形式化为Is the letter one of the following: "O", "Q"?
Python允许我们轻松地构建集合(使用Is the letter in the following set: {"O", "Q"}?
)关键字,但我们仍然必须明确我们正在检查set
是letter
这个集合的事实(即,我们测试设置成员资格,而不是相等)。幸运的是,我们并不严格要求一套检查会员资格。 (如果我们有大量要测试的元素,并且我们只需要构建一次但有许多字母要测试,那么我们可以通过正式创建in
来节省总时间,因为它们已经过优化成员资格测试;使用像set
这样的tuple
,Python需要一次检查一个元素。但在这里,("O", "Q")
工作得很好。)
简而言之:你按照别人说的方式解决问题,但他们对问题的解释应该让你提出更多问题(我希望我在这里回答)。