简单的布尔不等式运算符错误

Posted

技术标签:

【中文标题】简单的布尔不等式运算符错误【英文标题】:Simple boolean inequality operators mistake 【发布时间】:2012-08-08 08:49:57 【问题描述】:

使用不等式运算符,我必须定义一个过程 weekend,它接受一个字符串作为输入,如果是“星期六”或“星期日”则返回布尔值 True,否则返回 False

这是我的代码

def weekend(day):
    if day != 'Saturday' or day != 'Sunday':
        return False
    else:
        return True

这似乎每天都会返回False,我不知道为什么,从逻辑上讲它会起作用......有人可以解释一下吗?

【问题讨论】:

DeMorgan 的:x != a or y != b!(x == a and y == b) 相同。应该清楚的是,由于x == ya != b 这会产生一个刚玉:!(x == a and x == b) -> !(true and false) !(false and true) -> !(false) -> true :) 【参考方案1】:

固定版本:

if day != 'Saturday' and day != 'Sunday'

更好的版本:

return day in ['Saturday', 'Sunday']

为什么 or 不起作用:

当您使用or 时,您的条件将显示为“如果今天不是星期六或今天不是星期日”。现在将“今天”替换为“星期六”:

如果星期六不是星期六或星期六不是星期日

“星期六不是星期六”这句话显然是假的,而“星期六不是星期天”显然是真的,所以整个陈述就变成了“如果是假的或真的”,它总是正确的。

将“今天”替换为其他任何一天,您会发现该句子总是评估为以下句子之一,这总是正确的:

if True or False  # day = Sunday
if False or True  # day = Saturday
if True or True   # any other day

【讨论】:

确实,后一个版本是迄今为止最清晰和最 Pythonic 的方式。 感谢您的回答,但您能告诉我为什么“或”不起作用吗? @user1561559 我添加了一个解释为什么“或”在这里不起作用。 +1 包括对问题的解释和“更好的版本”的解决方法。 (当我写出冗长的答案时,打败我哈哈。)【参考方案2】:

处理这个问题的最好方法,使用这样的东西:

return day.lower() in ['saturday','sunday']

【讨论】:

【参考方案3】:

你的意思是and

def weekend(day):
    if day != 'Saturday' and day != 'Sunday':
        return False
    else:
        return True

或更清晰的版本(仅将 De Morgan 应用于上述):

def weekend(day):
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False

这一天总是不同于这两天中的一个

【讨论】:

反过来! if day == 'Saturday' or day == 'Sunday': return True 确实,很糟糕,我解释得对,但写错了例子。固定。【参考方案4】:

未来提示:仔细考虑您的代码,就好像您是计算机一样极其详细地。例如,我真的会和自己进行这样的对话:

嗯,当day = 'Saturday' 时,代码返回False,尽管我认为它不应该。让我们逐行看看发生了什么。

def weekend(day):

好的,从现在开始,我会用 'Saturday' 替换 day...

if day != 'Saturday' or day != 'Sunday':

好的,我会在心里把它翻译成if 'Saturday' != 'Saturday' or 'Saturday' != 'Sunday':。 现在我将通过评估比较来简化它。 'Saturday' != 'Saturday' 变为 False 'Saturday' != 'Sunday': 变为 True 插入这些,我看到if 语句说if False or True,与if True 相同。所以这意味着 day = Saturday 导致返回值 False

啊哈,现在我知道day = 'Saturday' 案例出了什么问题; day != 'Sunday' 条件意味着 if 评估为 True

因此,虽然下面的代码会为 day = 'Saturday' 返回 True

def weekend(day):
    if day != 'Saturday':
        return False
    else:
        return True

此代码适用于day = 'Sunday'

def weekend(day):
    if day != 'Sunday':
        return False
    else:
        return True

这两者不能与or 结合使用。

所以以后试着像这样对自己说话 - 这对调试非常有用,尤其是当布尔逻辑混乱时。

(作为记录,我认为return day.lower() in ['saturday','sunday'] 是解决这个问题的最佳方式。)

【讨论】:

【参考方案5】:
def weekend(day):
    # your code here
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False

【讨论】:

【参考方案6】:

我为Can not get “while” statement to progress 写了这个答案,但在我提交之前它被标记为重复。这是一个完全符合逻辑的重复 (x != foo or y != bar),所以我在此发布此内容,希望我的回答可能对某人有所帮助。

答案是逐字复制的。


你的问题在这里:

while username != logindata.user1 or username != logindata.user2:
...
while password != logindata.passw1 or password != logindata.passw2:

英文中的用户名循环类似于“如果提供的username 不等于user1 或不等于user2,则继续循环。”除非user1user2 相同,否则任何字符串都不会让其计算为False。如果“用户名”等于user1,它就不能等于user2(再次假设user1 != user2,这里就是这种情况)。

快速解决方法是将or 更改为and。这样,您将检查 username 是否不是可用选项中的任何一个。更好的写法是:

while not (username == logindata.user1 or username == logindata.user2):

但我会说,鉴于您正在尝试做的事情,正确的编写方法是:

while username not in [logindata.user1, logindata.user2]:

在英语中,类似“当用户名不在此用户名列表中时继续循环。”

附:为了迂腐的正确性,我打算使用集合而不是列表,但这并不重要,所以我认为列表对于初学者来说会更容易。只是在别人之前提到它:)。

【讨论】:

以上是关于简单的布尔不等式运算符错误的主要内容,如果未能解决你的问题,请参考以下文章

批量不等(不等式)运算符

SQL Server不等式比较运算符,为啥有两个[重复]

HBase 是不是支持对列表属性和不等式运算符进行索引?

如何使用 Fluent Assertions 在不等式测试中测试异常?

等式运算符(==)无效[关闭]

隐式运算符 != 解决运算符中的歧义 ==