假设我有一个带有return的if语句。从效率的角度来看,我应该使用
if(A > B):
return A+1
return A-1
or
if(A > B):
return A+1
else:
return A-1
在使用编译语言(C)或脚本语言(Python)时,我应该选择其中一种还是另一种?
假设我有一个带有return的if语句。从效率的角度来看,我应该使用
if(A > B):
return A+1
return A-1
or
if(A > B):
return A+1
else:
return A-1
在使用编译语言(C)或脚本语言(Python)时,我应该选择其中一种还是另一种?
当前回答
由于return语句终止了当前函数的执行,因此这两种形式是等效的(尽管可以说第二种形式比第一种形式更易于阅读)。
这两种形式的效率是相当的,如果if条件为假,底层机器码必须执行跳转。
注意,Python支持一种语法,允许你在你的情况下只使用一个return语句:
return A+1 if A > B else A-1
其他回答
这是一个风格(或偏好)的问题,因为解释器并不关心。就我个人而言,如果函数返回的值是缩进级别而不是函数基级别,那么我尽量不要在函数的最终语句中使用。例1中的else模糊了函数结束的位置,即使只是稍微模糊了一点。
根据偏好,我使用:
return A+1 if (A > B) else A-1
因为它既遵循了将单个return语句作为函数中的最后一条语句的良好约定(如前所述),又遵循了避免命令式中间结果的良好函数式编程范式。
For more complex functions I prefer to break the function into multiple sub-functions to avoid premature returns if possible. Otherwise I revert to using an imperative style variable called rval. I try not to use multiple return statements unless the function is trivial or the return statement before the end is as a result of an error. Returning prematurely highlights the fact that you cannot go on. For complex functions that are designed to branch off into multiple subfunctions I try to code them as case statements (driven by a dict for instance).
一些海报提到了操作速度。运行时的速度对我来说是次要的,因为如果你需要执行速度,Python不是最好的语言。我使用Python是因为它的编码效率(即编写无错误的代码)对我来说很重要。
关于编码风格:
大多数编码标准,无论哪种语言,都禁止从一个函数中使用多个return语句,这是一种糟糕的做法。
(尽管我个人认为在一些情况下,多个返回语句是有意义的:文本/数据协议解析器,具有广泛错误处理的函数等)
所有这些行业编码标准的共识是,表达式应该写成这样:
int result;
if(A > B)
{
result = A+1;
}
else
{
result = A-1;
}
return result;
关于效率:
上面的例子和问题中的两个例子在效率上是完全相同的。在所有这些情况下,机器代码必须比较A > B,然后分支到A+1或A-1计算,然后将结果存储在CPU寄存器或堆栈上。
编辑:
来源:
MISRA-C:2004规则14.7,其中引用了… IEC 61508 - 3。第三部分,表B.9。 IEC 61508 - 7。C.2.9。
来自Chromium的风格指南:
返回后不要使用else:
# Bad
if (foo)
return 1
else
return 2
# Good
if (foo)
return 1
return 2
return 1 if foo else 2
由于return语句终止了当前函数的执行,因此这两种形式是等效的(尽管可以说第二种形式比第一种形式更易于阅读)。
这两种形式的效率是相当的,如果if条件为假,底层机器码必须执行跳转。
注意,Python支持一种语法,允许你在你的情况下只使用一个return语句:
return A+1 if A > B else A-1
从性能的角度来看,这在Python中并不重要,我认为对所有现代语言都是如此。
归根结底是风格和可读性。第二个选项(if-else块)比第一个更具可读性,而且比一行三元操作可读性强得多。