python - 使用if-return-return或if-else-return更有效?

假设我的if声明带有return。从效率的角度来看,我应该使用

if(A > B):

return A+1

return A-1

要么

if(A > B):

return A+1

else:

return A-1

在使用编译语言(C)或脚本语言(Python)时,我应该更喜欢一个还是另一个?

9个解决方案

136 votes

由于return语句终止了当前函数的执行,因此这两种形式是等效的(尽管第二种形式可以说比第一种形式更具可读性)。

两种形式的效率相当,如果return条件为假,则底层机器代码必须执行跳转。

请注意,Python支持的语法允许您在您的情况下只使用一个return语句:

return A+1 if A > B else A-1

Frédéric Hamidi answered 2019-07-22T12:03:55Z

27 votes

来自Chromium的风格指南:

退货后请勿使用其他:

# Bad

if (foo)

return 1

else

return 2

# Good

if (foo)

return 1

return 2

return 1 if foo else 2

skeller88 answered 2019-07-22T12:04:26Z

5 votes

关于编码风格:

大多数编码标准无论语言禁止多个单一函数的返回语句都是不好的做法。

(虽然我个人会说有几种情况,多个return语句确实有意义:文本/数据协议解析器,具有广泛错误处理的函数等)

所有这些行业编码标准的共识是表达式应写成:

int result;

if(A > B)

{

result = A+1;

}

else

{

result = A-1;

}

return result;

关于效率:

上述示例和问题中的两个示例在效率方面都完全相同。 所有这些情况下的机器代码必须比较A> 1。 B,然后分支到A + 1或A-1计算,然后将其结果存储在CPU寄存器或堆栈中。

编辑:

资料来源:

MISRA-C:2004年规则14.7,反过来引用......:

IEC 61508-3。 第3部分,表B.9。

IEC 61508-7。C.2.9。

Lundin answered 2019-07-22T12:05:59Z

3 votes

有了任何合理的编译器,你应该没有区别; 它们应该编译成相同的机器代码,因为它们是等效的。

Oliver Charlesworth answered 2019-07-22T12:06:23Z

1 votes

版本A更简单,这就是我使用它的原因。

如果您打开Java中的所有编译器警告,您将在第二个版本上收到警告,因为它是不必要的并且会增加代码复杂性。

juergen d answered 2019-07-22T12:06:56Z

1 votes

我个人尽可能避免使用else块。 请参阅Anti-if Campaign

此外,他们不会为线路收取额外费用,你知道:p

“简单比复杂更好”& “可读性为王”

delta = 1 if (A > B) else -1

return A + delta

percebus answered 2019-07-22T12:07:36Z

0 votes

我知道问题是标记为python,但是它提到了动态语言,所以我认为我应该提到在ruby中if语句实际上有一个返回类型所以你可以做类似的事情

def foo

rv = if (A > B)

A+1

else

A-1

end

return rv

end

或者因为它也有简单的隐含回报

def foo

if (A>B)

A+1

else

A-1

end

end

这很好地解决了没有多次退货的风格问题。

Jamie Cook answered 2019-07-22T12:08:16Z

0 votes

可以这样想:

if (a > b):

output = a + 1

output = a - 1

return output

对此:

if (a > b):

output = a + 1

else:

output = a - 1

return output

第一个例子是无功能的,而第二个例子工作正常。 它们具有相同的性能,因此我建议您使用示例2,因为在我看来它更容易阅读。

Juniorized answered 2019-07-22T12:08:51Z

-1 votes

这是一个风格(或偏好)的问题,因为口译员并不关心。 就个人而言,我会尽量不做一个函数的最终语句,该函数在函数库以外的缩进级别返回一个值。 示例1中的else模糊了(如果只是轻微的话)函数结尾的位置。

我倾向于使用:

return A+1 if (A > B) else A-1

因为它遵循将单个return语句作为函数中的最后一个语句(如上所述)和避免命令式样式中间结果的良好函数式编程范式的良好约定。

对于更复杂的函数,我更喜欢将函数分解为多个子函数,以避免在可能的情况下过早返回。 否则我将恢复使用名为rval的命令式样式变量。 我尽量不使用多个return语句,除非函数是微不足道的,或者结尾之前的return语句是由于错误。 过早地回归会突显出你无法继续下去的事实。 对于旨在分支到多个子函数的复杂函数,我尝试将它们编码为case语句(例如由dict驱动)。

一些海报提到了运作速度。 运行速度对我来说是次要的,因为如果你需要执行速度,Python不是最好用的语言。 我使用Python作为编码的效率(即编写无错代码)对我来说很重要。

Stephen Ellwood answered 2019-07-22T12:09:46Z

更多推荐

python if return_python - 使用if-return-return或if-else-return更有效?