如果+或失败,即使反向条件有效

2024-10-03 06:24:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在自学python,我试图理解下面的示例失败的原因

#!/usr/bin/python3.4
vWHEN = sys.argv[1]
print (vWHEN)
if vWHEN != "before" or vWHEN != "after":
 exit("ERROR: " + vWHEN + " is invalid. Should be: 'before' or 'after'")

结果如下:

$ ptest.py before
before
ERROR: before is invalid. Should be: 'before' or 'after'

但以下方法确实有效:

#!/usr/bin/python3.4
vWHEN = sys.argv[1]
if vWHEN == "before" or vWHEN == "after":
 print (vWHEN)
else:
 exit("ERROR: " + vWHEN + " is invalid. Should be: 'before' or 'after'")

输出:

$ ptest.py before
before

Tags: orifbinisusrsyserrorbe
3条回答

您正在处理一个逻辑错误。让我们从当前版本(第二版)开始:

if a == "before" or a == "after":

这就像英语一样,如果a"before""after",则条件有效。但是,您的第一个(不正确)版本是:

if a != "before" or a != "after":

这将始终是True,因为a不能有2个值,所以or的一个分支将始终是True


解决方案

让我们应用De Morgan's Laws来看看如何反转条件逻辑。来表示正确案例的反向逻辑

A or B

我们需要

not (A or B)

根据法律规定

(not A) and (not B)

因此,第一个if语句的正确版本应该是:

if a != "before" and a != "after":  # notice the and instead of the or

旁注:要简化针对多个值的测试,请尝试使用以下方法:

if a in ("before", "after"):

if a not in ("before", "after"):

它读起来容易得多,因此也更容易推理

vWHEN != "before" or vWHEN != "after"将始终为真。任何字符串都不等于“before”或“after”(例如,“before”不等于“after”)

您应该使用布尔运算符-仅当用户输入的“before”和“after”都不需要出错时:

if vWHEN != "before" and vWHEN != "after":
    # Here      ^

我怀疑你想改变你的逻辑

if vWHEN != "before" and vWHEN != "after":
 exit("ERROR: " + vWHEN + " is invalid. Should be: 'before' or 'after'")

当您使用or而不是and时,无论vWHEN的值是多少,它都将始终进入if主体

相关问题 更多 >