【问题标题】:Simple boolean inequality operators mistake简单的布尔不等式运算符错误
【发布时间】:2012-08-08 08:49:57
【问题描述】:

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

这是我的代码

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

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

【问题讨论】:

  • DeMorgan 的:x != a or y != b!(x == a and y == b) 相同。应该清楚的是,由于x == ya != b 这会产生一个刚玉:!(x == a and x == b) -> !(true and false) !(false and true) -> !(false) -> true :)

标签: python return boolean inequality


【解决方案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

【讨论】:

  • 确实,后一个版本是迄今为止最清晰和最 Pythonic 的方式。
  • 感谢您的回答,但您能告诉我为什么“或”不起作用吗?
  • @user1561559 我添加了一个解释为什么“或”在这里不起作用。
  • +1 包括对问题的解释和“更好的版本”的解决方法。 (当我写出冗长的答案时,打败我哈哈。)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    这一天总是不同于这两天中的一个

    【讨论】:

    • 反过来! if day == 'Saturday' or day == 'Sunday': return True
    • 确实,很糟糕,我解释得对,但写错了例子。固定。
    【解决方案4】:

    未来提示:仔细考虑您的代码,就好像您是计算机一样极其详细地。例如,我真的会和自己进行这样的对话:

    嗯,当day = 'Saturday' 时,代码返回False,尽管我认为它不应该。让我们逐行看看发生了什么。

    def weekend(day):

    • 好的,从现在开始,我会用 'Saturday' 替换 day...

    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

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

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

    【讨论】:

      【解决方案5】:
      def weekend(day):
          # your code here
          if day == 'Saturday' or day == 'Sunday':
              return True
          else:
              return False
      

      【讨论】:

        【解决方案6】:

        我为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。如果“用户名”等于user1,它就不能等于user2(再次假设user1 != user2,这里就是这种情况)。

        快速解决方法是将or 更改为and。这样,您将检查 username 是否不是可用选项中的任何一个。更好的写法是:

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

        但我会说,鉴于您正在尝试做的事情,正确的编写方法是:

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

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

        附:为了迂腐的正确性,我打算使用集合而不是列表,但这并不重要,所以我认为列表对于初学者来说会更容易。只是在别人之前提到它:)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-29
          • 1970-01-01
          • 2015-10-22
          • 2012-04-07
          • 2011-06-12
          • 2016-02-18
          • 1970-01-01
          • 2010-11-05
          相关资源
          最近更新 更多