为什么输出与这两个输出不同?

时间:2018-10-26 10:51:37

标签: python if-statement

为什么此代码错误:

def parrot_trouble(talking, hour):
  if talking == True and hour < 7 or hour > 20:
    return True
  else : 
    return False

为什么此代码正确:

def parrot_trouble(talking, hour):
  if talking == True and (hour < 7 or hour > 20):
    return True
  else : 
    return False

7 个答案:

答案 0 :(得分:1)

看案例parrot_trouble(False, 21)

它应该返回False,但是在第一个版本中它返回True

那是因为第一版代码被视为:

def parrot_trouble(talking, hour):
  if (talking == True and hour < 7) or hour > 20:
    return True
  else : 
    return False

这里没有满足第一个条件(用括号括起来),但是第二个条件不重要,在它们之间使用or。在第二个版本中不会发生这种情况,因为当鹦鹉不说话时,我们没有任何麻烦。

答案 1 :(得分:0)

第一个函数不一定是错误的,只是模棱两可。您必须知道首先评估and还是or语句才能知道结果。

第二个功能在如何评估条件方面非常清楚,因此比第一个功能更易于阅读。

它也是Python ZEN(https://www.python.org/dev/peps/pep-0020/)的一部分: “面对模棱两可,拒绝猜测的诱惑。”

答案 2 :(得分:0)

先通过括号执行代码,但这不是您想要的。不是第一,但不适用于此处。并且是第二和或最后。括号无法正常工作。但这没错。

答案 3 :(得分:0)

Operator precedence进行救援。在此处查看更多详细信息。
在您的情况下,第一个翻译为”(如果有此内容)或该,因为and的优先级更高。第二个是不言自明的。

答案 4 :(得分:0)

尽管您未指定正确的含义,但这两个实现之间的区别在于and运算符或一个或多个运算符具有不同的优先级。这意味着,在没有括号的情况下,and将首先被评估。 请参阅以下内容中的运算符优先级: https://docs.python.org/3/reference/expressions.html

答案 5 :(得分:0)

RecordUnmapperProvider的优先顺序比and大。

在第一段代码中,首先对or表达式求值,随后的结果将是talking == True and hour < 7or表达式。

在第二个代码块中,hour > 20表达式由于内在括号而被首先求值,其后续结果将是带有hour < 7 or hour > 20表达式的and

答案 6 :(得分:0)

与大多数编程语言以及Boolean algebra一样,and运算符的优先级高于Python中的or运算符。因此,如果您希望在同一个表达式中的or操作之前先评估and操作,则需要在or操作周围加上括号。

您可以参考Python文档的Operator precedence部分以获取详细信息。