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

时间:2012-08-11 04:59:11

标签: python boolean return operator-keyword inequality

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

这是我的代码

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

这似乎每天都会返回False,我不知道为什么,从逻辑上来说它会起作用.o_o ..任何人都可以解释一下我太不容乐观了:S

6 个答案:

答案 0 :(得分:6)

修正版:

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

答案 1 :(得分:5)

处理此问题的最佳方法是使用以下内容:

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

答案 2 :(得分:1)

您的意思是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

这一天总是与两天的一个不同。

答案 3 :(得分:0)

提示未来:仔细考虑您的代码,就好像您是计算机一样令人难以忍受的细节。例如,我真的会和自己进行这种对话:

嗯,当day = 'Saturday'时,代码返回False,即使我认为它不应该。让我们一起看看会发生什么。

def weekend(day):

  • 好的,从现在开始看起来不错,我会随时将day替换为'Saturday' ......

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

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

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']是解决此问题的最佳方式。)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我为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。如果'username'等于user1,则它不能等于user2(再次假设user1 != user2,在这种情况下)。

快速解决方案是将or更改为and。这样,您正在检查username是否不是可用选项之一。更好的书写方式是:

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

但是我要说的是,鉴于您要执行的操作,正确的编写方式是:

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

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

P.S。为了学究的正确性,我打算使用一个集合而不是一个列表,但这确实无关紧要,所以我认为列表对于初学者来说会更容易。只是在其他人之前提到它:)。