简单的布尔不等式运算符错误
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 == y
和a != 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
,则继续循环。”除非user1
和user2
相同,否则任何字符串都不会让其计算为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]:
在英语中,类似“当用户名不在此用户名列表中时继续循环。”
附:为了迂腐的正确性,我打算使用集合而不是列表,但这并不重要,所以我认为列表对于初学者来说会更容易。只是在别人之前提到它:)。
【讨论】:
以上是关于简单的布尔不等式运算符错误的主要内容,如果未能解决你的问题,请参考以下文章