假设我有一个带有return的if语句。从效率的角度来看,我应该使用

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

or

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

在使用编译语言(C)或脚本语言(Python)时,我应该选择其中一种还是另一种?


当前回答

我知道这个问题被标记为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

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

其他回答

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

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

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

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

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

如果你在Java中打开了所有的编译器警告,你会在第二个版本中得到一个警告,因为这是不必要的,而且会增加代码的复杂性。

我知道这个问题被标记为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

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

从性能的角度来看,这在Python中并不重要,我认为对所有现代语言都是如此。

归根结底是风格和可读性。第二个选项(if-else块)比第一个更具可读性,而且比一行三元操作可读性强得多。

关于编码风格:

大多数编码标准,无论哪种语言,都禁止从一个函数中使用多个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。