关于在“if x or y or z”中链接多个“not”的问题

Question about chaining multiple "not" in "if x or y or z"

提问人:Thanach 提问时间:9/7/2023 最后编辑:juanpa.arrivillagaThanach 更新时间:9/7/2023 访问量:46

问:

美好的一天,我目前正在尝试编写一个简单的程序,作为我课程练习的一部分,它与用户一起玩石头剪刀布。我已经完成了任务本身,但想充实一下,并尝试添加以下代码,该代码应该检查单词的拼写错误变体,并让用户知道他们的输入无效:

elif not b=="schere" or b=="stein" or b=="papier":
    print("Zu dumm zum tippen!?")

现在我的问题是,在这种形式下,代码实际上不起作用。虽然它正确地承认“schere”是正确的输入,并且在这种情况下有效地“不做任何事情”,但它会阻止其他输入无效。这对我来说是有道理的,因为代码将输入“stein”或“papier”转换为 True,从而触发打印。目前为止,一切都好?

但是,我似乎无法弄清楚如何正确地将它们链接在一起。如果我在每个后面放置额外的“not”,或者,正如我所假设的那样,它应该起作用,它似乎不再正确地做任何事情,并将任何输入标记为不正确并打印上述短语。当我“仅”尝试将另一个而不是添加到其中一个“或”时,会发生相同的故障。有没有可能像我一样把它们链接在一起?我尝试在这里进行谷歌搜索和搜索,但我找到的都是关于链接多个和/或语句的帖子/教程,但没有关于否定这些的帖子/教程。

IIRC 我们正在使用 python 3.5

python-3.x if语句

评论

1赞 trincot 9/7/2023
not具有比 和 运算符更高的优先级,但您需要先应用这些运算符,然后再应用于该结果。因此,将括号括起来,以括号括住您想要拥有的表达式。您也可以查看操作员。==or==ornotnotnot in
0赞 juanpa.arrivillaga 9/7/2023
“ 如果我在每个后面加上额外的”not“,或者,正如我认为它应该工作的那样,它似乎不再正确地做任何事情”,因为这不是分离的否定的工作方式!学习德摩根定律
0赞 Thanach 9/7/2023
非常感谢trincot的解释和解决方案!感谢 juanpa 对 de Morganss 法律的回复!

答:

1赞 juanpa.arrivillaga 9/7/2023 #1

因为:

 not b == "schere" or b == "stein" or b == "papier"

相当于:

(not b == "schere") or b == "stein" or b == "papier"

因为 not 的优先级高于 or

一个简单的解决方案:

not (b == "schere" or b == "stein" or b == "papier")

请注意,如果你想通过分发 来获得等效逻辑,你必须使用 De Morgan 定律!not

等价物是:

(not b == "schere") and (not b == "stein") and (not b == "papier")

即,等价于not (P or Q)(not P) and (not Q)

评论

1赞 deceze 9/7/2023
注意:您应该使用而不是...!=not ==
0赞 juanpa.arrivillaga 9/7/2023
@deceze在这种特殊情况下肯定是这样