Python 元组,检查字符串中的字母

Python 元组,检查字符串中的字母,python,tuples,Python,Tuples,我有以下代码: 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"): 创建包含两个字母的新元组:O和Q,并检查值字母是

我有以下代码:

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"):
创建包含两个字母的新元组:O和Q,并检查值字母是否存在

我不确定的是为什么这不能正常工作:

if letter == "O" or "Q":

此代码将在所有前缀中添加“u”,而不仅仅是那些带有“O”和“Q”的前缀。

所有这些前缀的作用相同:

if letter == "O" or letter == "Q":
if letter in ("O", "Q"):
if letter in "OQ":
如果字母==“O”或“Q”,则行
的计算方式与
if(字母==“O”)或“Q”类似,并且
“Q”
的计算方式为
True
,因此此表达式始终返回
True

if letter == "O" or "Q":
这可以重写为:

if (letter == "O") or ("Q"):
最后一部分是一个非空字符串,它的计算结果总是
True
,因此整个表达式是
True

if letter == "O" or "Q":
所以你要这样写:

if letter == "O" or letter == "Q":
或者使用元组代码(更好)。

问题在于:

if letter == "O" or "Q":
应该是:

if letter == "O" or letter == "Q":

将“u”添加到所有前缀的原因是“Q”始终为真。

相等比较优先于“or”运算符:

如果字母==“O”或“Q”:

如果1)字母为“O”或2)“Q”,则成功


由于“Q”的计算结果为True,因此此if语句始终成功。

值得注意的是,即使优先级不同,它也不起作用:

if letter == ("O" or "Q"):
这是不好的,因为
“O”
是真的,所以
“O”或“Q”
是“O”,所以我们只需将
字母
“O”
进行比较,然后完全忽略
“Q”

在英语中,我们认为
“O”或“Q”
是一个抽象概念,根据逻辑要求,它是不确定的
“O”
“Q”
。然而,计算机处理的是确定性数量。我们能找到的最接近英语短语
的是字母“O”或“Q”
(更准确地说,当我们在这里:))是
是下列字母之一:“O”,“Q”
,我们可以将其形式化为
是以下集合中的字母:{“O”,“Q”}

Python允许我们轻松地构造集合(使用
set
)关键字,但我们仍然必须明确一个事实,即我们正在检查
字母
是否在该集合中
(即,我们测试的是集合成员资格,而不是相等性)。幸运的是,我们并不严格要求使用集合来检查成员资格。(如果我们有大量的元素要测试,并且我们只需要构建一次集合,但有许多字母要测试,那么我们可以通过正式创建
集合
,从而节省总体时间,因为它们针对成员资格测试进行了优化;使用
元组
类似
(“O”,“Q”)
,Python需要一次检查一个元素。但是在这里,
元组可以正常工作。)


简言之:您按照其他人所说的方式解决了问题,但他们对问题的解释应该会让您提出更多的问题(我希望我在这里回答)。

您在第一个示例中遗漏了一个“=”。谢谢你的回答。@user890245:Oops。谢谢-修复了。我发现它更可读、更简洁,仅此而已。