使用这种不等式经营者,我必须定义一个过程周末这需要一个字符串作为它的输入,并返回布尔值true,如果它是“星期六”或“周日”,否则为假。
这里是我的代码
def weekend(day):
if day != 'Saturday' or day != 'Sunday':
return False
else:
return True
这个看似返回False每天,我不知道为什么,在逻辑上会work..o_o ..谁能请解释我太小白:S
使用这种不等式经营者,我必须定义一个过程周末这需要一个字符串作为它的输入,并返回布尔值true,如果它是“星期六”或“周日”,否则为假。
这里是我的代码
def weekend(day):
if day != 'Saturday' or day != 'Sunday':
return False
else:
return True
这个看似返回False每天,我不知道为什么,在逻辑上会work..o_o ..谁能请解释我太小白:S
修正版本:
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
最好的办法来解决这个问题,使用这样的:
return day.lower() in ['saturday','sunday']
你的意思是and
def weekend(day):
if day != 'Saturday' and day != 'Sunday':
return False
else:
return True
或者更清晰的版本(这只是适用德摩根以上):
def weekend(day):
if day == 'Saturday' or day == 'Sunday':
return True
else:
return False
这一天总是会从两日不同 。
提示为未来:想通过你的代码,如果你是在痛苦的详细的计算机。 例如,我会从字面上有这样的对话与自己:
嗯,当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']
是接近最好的办法。)
def weekend(day):
# your code here
if day == 'Saturday' or day == 'Sunday':
return True
else:
return False
我写这个答案不能让“而”语句进步 ,但我提交之前,它被标记为重复的权利。 它是一个确切的逻辑副本( 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]:
在英语中,类似“不断循环,而用户名不是用户名的列表中。”
PS我打算用的,而不是列表的设置,为迂腐的正确性,但它其实并不重要,对于这一点,所以我的列表将对于初学者更容易。 只要提到它之前别人做:)。