假设我有一个if
带有的语句return
。从效率的角度来看,我应该使用
if(A > B):
return A+1
return A-1
要么
if(A > B):
return A+1
else:
return A-1
使用编译语言(C)或脚本化语言(Python)时,我应该选择一种还是另一种?
假设我有一个if
带有的语句return
。从效率的角度来看,我应该使用
if(A > B):
return A+1
return A-1
要么
if(A > B):
return A+1
else:
return A-1
使用编译语言(C)或脚本化语言(Python)时,我应该选择一种还是另一种?
Answers:
由于该return
语句终止了当前函数的执行,因此两种形式是等效的(尽管第二种形式比第一种更具可读性)。
两种形式的效率都相当,如果if
条件为假,则基础机器代码必须执行跳转。
请注意,Python支持一种语法,该语法仅允许您使用一种return
情况:
return A+1 if A > B else A-1
return (A>B)?A+1:A-1;
但是,这样编写代码绝对不会提高性能。我们所获得的一切就是使代码变得混乱,不可读,并且在某些情况下更容易受到隐式类型提升的影响。
<
是不明智的做法,因为-1 < 1u
会产生意外结果。
-1 < 1u
,我对此表示怀疑,那么他们很容易发现该错误。但是,很多人会写一些我发布的代码版本。我在生产代码中经常看到这样的错误,以至于无法信任?:运算符。根据经验,如果该语言为您提供两种不同的方式来做相同的事情,则仅使用其中一种,不要根据自己的心情随机选择这两种方式中的任何一种。
根据Chromium的风格指南:
返回后请勿使用其他:
# Bad
if (foo)
return 1
else
return 2
# Good
if (foo)
return 1
return 2
return 1 if foo else 2
if-else-return
分支几乎永远不相等(如果分支相等,那么无论如何您都应该重构;使用switch
构造或Python,枚举dict /使用callable /等)。因此,几乎所有if-else-return
情况都是保护子句,并且总是可测试的(模拟被测试的表达式)而没有else
。
关于编码风格:
无论哪种语言,大多数编码标准都禁止从单个函数中使用多个返回语句,这是一种不好的做法。
(尽管我个人会说在某些情况下多个返回语句确实有意义:文本/数据协议解析器,具有大量错误处理的功能等)
所有这些行业编码标准的共识是,该表达式应写为:
int result;
if(A > B)
{
result = A+1;
}
else
{
result = A-1;
}
return result;
关于效率:
上面的示例和问题中的两个示例在效率方面都完全等效。在所有这些情况下,机器码都必须比较A> B,然后跳转到A + 1或A-1计算,然后将结果存储在CPU寄存器或堆栈中。
编辑:
资料来源:
return
任何明确的地方放上代码都是Python的惯用方式。
因为口译员不在乎,所以这是一个风格(或偏好)问题。就我个人而言,我尽量不要对以函数基础以外的缩进级别返回值的函数做最终声明。示例1中的else会(即使只是稍微)掩盖了函数的结束位置。
根据偏好,我使用:
return A+1 if (A > B) else A-1
因为它遵循了将单个return语句作为函数中的最后一条语句的良好约定(如已提到的那样)以及避免命令式中间结果的良好的函数编程范例。
对于更复杂的功能,我更喜欢将功能分解为多个子功能,以避免可能的过早返回。否则,我将恢复使用称为rval的命令式样式变量。我尽量不要使用多个return语句,除非该函数是微不足道的,或者在结束之前的return语句是由于错误导致的。过早返回会突出显示您无法继续前进的事实。对于旨在分解为多个子功能的复杂功能,我尝试将它们编码为case语句(例如,由dict驱动)。
一些海报提到了运行速度。对于我来说,运行时的速度是次要的,因为如果您需要执行速度,那么Python并不是最好的语言。我将Python用作对我很重要的编码效率(即编写无错误代码)。
var n = 1 if (A > B) else -1
return A+n
我个人else
尽可能避免阻塞。参见反假宣传运动
另外,他们不收取“额外”费用,你知道:p
“简单胜于复杂”和“可读性为王”
delta = 1 if (A > B) else -1
return A + delta
dict
s来避免差异是一个非常糟糕的主意。
我知道这个问题被标记为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
解决了没有很好的多次收益的样式问题。