蟒蛇:简单的布尔不平等运营商的错误(python: simple boolean inequalit

2019-06-26 23:09发布

使用这种不等式经营者,我必须定义一个过程周末这需要一个字符串作为它的输入,并返回布尔值true,如果它是“星期六”或“周日”,否则为假。

这里是我的代码

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

这个看似返回False每天,我不知道为什么,在逻辑上会work..o_o ..谁能请解释我太小白:S

Answer 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


Answer 2:

最好的办法来解决这个问题,使用这样的:

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


Answer 3:

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

这一天总是会从两日不同



Answer 4:

提示为未来:想通过你的代码,如果你是在痛苦的详细的计算机。 例如,我会从字面上有这样的对话与自己:

嗯,当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

两者可以不与组合or

所以,试着跟自己一样,在它的调试超好用的面向未来,尤其是当有混淆布尔逻辑。

(根据记录,我认为return day.lower() in ['saturday','sunday']是接近最好的办法。)



Answer 5:

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


Answer 6:

我写这个答案不能让“而”语句进步 ,但我提交之前,它被标记为重复的权利。 它是一个确切的逻辑副本( 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 。 如果“用户名”等于user1 ,它不能等于user2 (再次,假设user1 != user2 ,这是这里的情况)。

快速的解决办法是改变orand 。 这样一来,你是否检查username不是非此即彼的可用选项。 一个更好的方式来写,这将是:

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

但我要说的是正确的方式来写它,因为你想要做什么,是这样的:

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

在英语中,类似“不断循环,而用户名不是用户名的列表中。”

PS我打算用的,而不是列表的设置,为迂腐的正确性,但它其实并不重要,对于这一点,所以我的列表将对于初学者更容易。 只要提到它之前别人做:)。



文章来源: python: simple boolean inequality operators mistake