Python 使用if/else生成初学者序列时出现语义错误

Python 使用if/else生成初学者序列时出现语义错误,python,for-loop,traversal,if-statement,Python,For Loop,Traversal,If Statement,我的程序应该输出: 杰克、卡克、拉克、麦克、纳克、乌克、帕克和嘎嘎 suffix="ack" prefix="JKLMNOPQ" for i in prefix: if prefix=="Q" or "O": suffix="uack" else: suffix="ack" print i + suffix 但相反,它输出 胡克,胡克,卢克,穆克,努克 哎哟 普阿克 嘎嘎您应该将循环中的前缀与i进行比较,而不是与前缀进行比较。if前缀=

我的程序应该输出: 杰克、卡克、拉克、麦克、纳克、乌克、帕克和嘎嘎

suffix="ack"
prefix="JKLMNOPQ"

for i in prefix:
    if prefix=="Q" or "O":
        suffix="uack"
    else:
        suffix="ack"
    print i + suffix
但相反,它输出 胡克,胡克,卢克,穆克,努克 哎哟 普阿克
嘎嘎

您应该将循环中的前缀与i进行比较,而不是与前缀进行比较。if前缀=='Q'或'O'将始终为True,即使您与i进行比较,因为'O'不是False。如果i=='Q'或i=='O',则应为

您正在将包含多个字母(而不是当前字符i)的字符串前缀与单个字母进行比较。他们永远不平等。我建议使用更好的名称,这会使错误变得明显:前缀=JK。。。对于前缀中的前缀:。 通过在逻辑or中不使用任何比较运算符将O强制为布尔值。如果prefix==Q为false,它会将O转换为布尔值-非空字符串被视为true。可以使用prefix==Q或prefix==O,也可以在Q,O中使用prefix,它可以更好地扩展以获得更多备选方案。你不会相信这个错误有多普遍。。。是的,它碰巧使用了一些从英语借来的关键词,但它不是英语 前缀==Q或O完全错误

前缀将始终是JKLMNOPQ,因此永远不会等于Q。我想你的意思是检查I而不是前缀 ==绑定的距离比前缀==Q或O更近,因此它将计算为前缀==Q或O。O始终为真,因此后缀始终为uack` 如果你解决了这些问题,它应该会起作用


我认为应该是I==Q或I==O。

前缀是JKLMNOPQ。它永远不会等于'Q'或'O'。努法尔·易卜拉欣:你是正确的,前缀永远不会等于Q或O,但是boolprefix=='Q'或'O'将导致True,而不管前缀绑定到哪个值。True,但你在回答中明确要求他使用if prefix='Q'或prefix='O',这是错误的。@努法尔·易卜拉欣:我犯了愚蠢的错误假设前缀已经是指单个字符的错误-我的大脑在没有注意到的情况下用i替换前缀。。。哦,这是原始代码的另一个问题。变量名选择不当。O与此无关。或短路。O甚至不会被计算,因为Q返回True。O仅在Q返回False时求值。@A:否,在Python中选择运算符优先级是明智的,这样您就可以编写expr cmp op expr逻辑op expr cmp op expr,而无需参数。它将首先计算==的值。你错了A。代码从不测试Q的布尔值。它测试前缀==Q的布尔值,该值将始终为False。因此,or没有短路。然后它将计算O,O将返回True。尝试评估p=abc;p==Q或1。它将计算为1。@tom10:也可以。虽然它只针对单个字符,但不太通用。