我为什么不能在Python的条件流控制条件中使用return()?

时间:2019-05-20 19:25:30

标签: python return conditional-operator

考虑此功能:

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语句是   异步生成器函数中的语法错误。

在我看来,该定义中的任何内容都无法排除我正在尝试的用法。这里有我不理解的东西吗?

2 个答案:

答案 0 :(得分:7)

此处的区别是“语句”和“表达式”之间。 A if B else C表达式要求A,B和C为表达式。 return是一条语句,因此在那里不起作用-与breakraise相同。

答案 1 :(得分:4)

原因恰如其名。这是声明。语句与表达式不同。您可以将多个表达式组成一个更大的表达式。陈述并非如此;语句的定义特征是它不能成为较大表达式的一部分,部分原因是它的行为不同(通常控制流),部分原因是它没有产生可以构成的值变成更大的表情