考虑此功能:
def parity(num):
num % 2 == 0 and return "that is even"
return "that is odd"
函数的第一行是语法错误(我正在使用v 3.7.3)。为什么?似乎您应该可以从任何地方“返回”。
注意:我意识到在这种特定情况下,我可以使用
return "that is even" if num % 0 == 0 else "that is odd"
那不是我的问题。我的问题是,如果您编写以下代码,它会更紧凑,更容易阅读该流程:
condition 1 or return "condition one was not met"
condition 2 or return "condition two was not met"
condition 3 or return "contition three what not met"
[rest of the function goes here]
大于:
if not condition 1:
return "condition one was not met"
if not condition 2:
return "condition two was not met"
if not condition 3:
return "condition three was not met"
[rest of the function goes here]
并且-除了对简洁/可读性的这种偏爱之外-对我而言,我不能仅仅在代码中的那个位置执行返回就根本没有意义。 documentation for return说:
7.6。返回语句
return_stmt ::= "return" [expression_list]
返回可能仅在语法上嵌套在函数定义中, 不在嵌套的类定义中。
如果存在表达式列表,则对其求值,否则为None 替代。
return将当前函数调用留给表达式列表(或 无)作为返回值。
当return将控制权从带有try语句的try语句中移出时 子句,在真正离开 功能。
在生成器函数中,return语句指示 生成器已完成,将导致StopIteration升高。的 返回值(如果有)用作构造的参数 StopIteration并成为StopIteration.value属性。
在异步生成器函数中,空的return语句 表示异步生成器已完成,将导致 引发StopAsyncIteration。非空return语句是 异步生成器函数中的语法错误。
在我看来,该定义中的任何内容都无法排除我正在尝试的用法。这里有我不理解的东西吗?
答案 0 :(得分:7)
此处的区别是“语句”和“表达式”之间。 A if B else C
表达式要求A,B和C为表达式。 return
是一条语句,因此在那里不起作用-与break
或raise
相同。
答案 1 :(得分:4)
原因恰如其名。这是声明。语句与表达式不同。您可以将多个表达式组成一个更大的表达式。陈述并非如此;语句的定义特征是它不能成为较大表达式的一部分,部分原因是它的行为不同(通常控制流),部分原因是它没有产生可以构成的值变成更大的表情