2

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

这是我的代码

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

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

4

6 回答 6

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
于 2012-08-11T05:01:56.450 回答
5

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

return day.lower() in ['saturday','sunday']
于 2012-08-11T05:03:19.513 回答
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

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

于 2012-08-11T05:02:28.983 回答
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.

所以虽然下面的代码会返回Trueday = '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

两者不能与 a 结合使用or

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

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

于 2012-08-11T05:38:19.713 回答
0
def weekend(day):
    # your code here
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False
于 2016-10-03T13:09:40.833 回答
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:

The username loop in English is something like, "Keep looping if the provided username is either not equal to user1, or not equal to user2." Unless user1 and user2 are the same, no string will ever let that evaluate to False. If 'username' is equal to user1, it cannot be equal to user2 (again, assuming user1 != user2, which is the case here).

The quick fix is to change the or to and. That way, you're checking whether username is not either of the available options. A better way to write that would be:

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

But I would say that the correct way to write it, given what you're trying to do, is this:

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

In English, something like, "Keep looping while the username is not in this list of usernames."

P.S. I was going to use a set instead of a list, for pedantic correctness, but it really doesn't matter for this, so I figured a list would be easier for a beginner. Just mentioning it before someone else does :).

于 2018-12-03T04:17:11.830 回答