为什么此代码错误:
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
答案 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 < 7
和or
表达式。
在第二个代码块中,hour > 20
表达式由于内在括号而被首先求值,其后续结果将是带有hour < 7 or hour > 20
表达式的and
。
答案 6 :(得分:0)
与大多数编程语言以及Boolean algebra一样,and
运算符的优先级高于Python中的or
运算符。因此,如果您希望在同一个表达式中的or
操作之前先评估and
操作,则需要在or
操作周围加上括号。
您可以参考Python文档的Operator precedence部分以获取详细信息。