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
表达式,随后的结果将是和withtalking==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)