使用不等式运算符,我必须定义一个过程周末,它以字符串作为输入,如果是“星期六”或“星期日”,则返回布尔值True,否则返回False。
这是我的代码
def weekend(day):
if day != 'Saturday' or day != 'Sunday':
return False
else:
return True
这似乎每天都会返回False,我不知道为什么,从逻辑上来说它会起作用.o_o ..任何人都可以解释一下我太不容乐观了:S
答案 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
,请继续循环。”除非user1
和user2
相同,否则不会有任何字符串将其取值为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。为了学究的正确性,我打算使用一个集合而不是一个列表,但这确实无关紧要,所以我认为列表对于初学者来说会更容易。只是在其他人之前提到它:)。