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

Python 为什么输出与这两个不同?,python,if-statement,Python,If Statement,为什么这个代码是错误的: def parrot_trouble(talking, hour): if talking == True and hour < 7 or hour > 20: return True else : return False def parrot_故障(谈话,小时): 如果talking==真且小时数20: 返回真值 其他: 返回错误 为什么这个代码是正确的: def parrot_trouble(talking, hour):

为什么这个代码是错误的:

def parrot_trouble(talking, hour):
  if talking == True and hour < 7 or hour > 20:
    return True
  else : 
    return False
def parrot_故障(谈话,小时):
如果talking==真且小时数<7或小时数>20:
返回真值
其他:
返回错误
为什么这个代码是正确的:

def parrot_trouble(talking, hour):
  if talking == True and (hour < 7 or hour > 20):
    return True
  else : 
    return False
def parrot_故障(谈话,小时):
如果talking==真且(小时<7或小时>20):
返回真值
其他:
返回错误

第一个函数不一定是错误的,它只是模棱两可。您必须知道是先计算
还是
语句才能知道结果

第二个函数非常清楚如何计算条件,因此比第一个函数更容易阅读

它也是Python之禅()的一部分:
“面对歧义,拒绝猜测。”

括号首先执行它们的代码,但这不是您想要的。不是第一个,但在这里不适用。是第二位,或是最后一位。括号不能按预期工作。但这并没有错。

看看这个案例
鹦鹉学舌(False,21)

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

这是因为代码的第一个版本被视为:

def parrot_trouble(talking, hour):
  if (talking == True and hour < 7) or hour > 20:
    return True
  else : 
    return False
def parrot_故障(谈话,小时):
如果(通话==正确且小时数<7)或小时数>20:
返回真值
其他:
返回错误
这里不满足第一个条件(括号中),但这并不重要,因为满足了第二个条件,在它们之间使用
。在第二个版本中不会发生这种情况,因为当鹦鹉不说话时,我们没有问题。

为您解围。请在那里查看更多详细信息。

在您的例子中,第一个转换为(如果这个和这个)或那个“,因为
具有更高的优先级。第二个是不言自明的。

尽管您没有指定正确的含义,但两种实现之间的区别在于And运算符或运算符具有不同的优先级。这意味着,在没有偏执的情况下,首先对和进行评估。 请参见中的运算符优先级:
相比,
的优先顺序更高

在第一个代码块中,首先计算
talking==True和hour<7
表达式,其后续结果将是
带有
hour>20
表达式


在第二个代码块中,由于内圆括号的缘故,首先计算
hour<7或hour>20
表达式,随后的结果将是
with
talking==True
表达式,在Python中,
运算符的优先级高于
运算符。因此,如果希望在同一表达式中的
操作之前计算
操作,则需要在
操作周围加上括号


有关详细信息,请参阅Python文档的一节。

您所说的“对”和“错”是什么意思?如何调用该函数?预期产量是多少?实际产量是多少?请阅读,以及。最后,学习如何创建一个。如果你能检查一下,这是在codingbat warmup 1 parrot中遇到的问题,那太好了。我的意思是,如果我不把括号放在if语句中,输出是不同的。相关:可能重复的,那么如果我不把括号放在if语句中,有什么区别呢?在函数求值中没有区别。区别在于代码的可读性我的问题是:我们有一只会大声说话的鹦鹉。“小时”参数是范围为0..23的当前小时时间。如果鹦鹉在说话,而时间在7点之前或20点之后,我们就有麻烦了。如果我们遇到麻烦,请返回True。当我键入第一个时,它的工作原理与第二个不一样,我不知道为什么请阅读本教程:因此,首先计算括号中的一个?对于案例
parrot\u麻烦(False,21)
上面的代码在前两个条件(括号中)中为您提供
False
True
在第三个字段中。拥有
False或True
将始终返回
True
,在您的情况下,结果应该是
False
,是的,没有括号,它将首先“查看”和
,然后带有
的结果具有比
更高的优先级,正如@Aran在链接中指出的-Fey@Piotrek回答得很好,@s0meth1ngg我会简化函数的实现方式:
def parrot\u麻烦(交谈,小时):返回交谈和(小时<7或小时>20)