Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当有多个if语句时,只保留函数的一个出口_Python - Fatal编程技术网

Python 当有多个if语句时,只保留函数的一个出口

Python 当有多个if语句时,只保留函数的一个出口,python,Python,当一个函数包含多个if语句时,最好只保留一个出口。在类似php的语言中,我可以使用do while(false),如下所示: function a() { do { if (...) break; ... if (...) break; ... } while (FALSE); ... return; } 如何在python中实现这一点?虽然我可以使用while(true),但如果缺少尾随中断,它将

当一个函数包含多个if语句时,最好只保留一个出口。在类似php的语言中,我可以使用do while(false),如下所示:

function a() {
    do {
        if (...) break;
        ...
        if (...) break;
        ...
    } while (FALSE);
    ...
    return;
}
如何在python中实现这一点?虽然我可以使用while(true),但如果缺少尾随中断,它将是一个死循环

while True:
    if ...: break
    ...
    if ...: break
    ...
    # oops, miss the 'break', you're dead
有没有更像蟒蛇的方法

PS:为了进一步说明一个出口:

function a() {
    if (...) { $a = 1; log($a); return $a; }
    if (...) { $a = 2; log($a); return $a; }
    if (...) { $a = 3; log($a); return $a; }
}

function a() {
    do {
        if (...) { $a = 1; break; }
        if (...) { $a = 2; break; }
        if (...) { $a = 3; break; }
    } while (FALSE);
    log($a);
    return $a;
}

希望你能看到不同之处。

你可以用try,catch。您只需要引发一个异常,而不是中断

请参阅本页:


实现您提到的目标(记录返回值)的一种更具python风格的方法是将整个函数包装在一个decorator中。例如:

from functools import wraps

def print_return(fn):
    @wraps(fn)
    def wrapped(*args, **kwargs):
        return_value = fn(*args, **kwargs)
        print return_value
        return return_value
    return wrapped


@print_return
def foo(a, b):
    return a + b

我认为一个while循环是一个很难实现你想要的东西的方法。为什么不使用局部变量呢

def f(x):
  result = None

  if (...): result = 1
  elif (...): result = 2
  elif (...): result = 3
  else: result = 4

  log(result)
  return result

要在Python中实现这一点,我将这样编写(请参见):



我不明白使用do..while(false)构造会得到什么。我不明白为什么在第一个示例中需要while循环。如果您不履行任何If声明,您将退出If并返回。。没有while也一样,对吗?你需要给出一个更好的例子,因为现在看起来你可以使用多个
,如果
语句单个退出函数是不好的,原因有很多:你永远不能用大多数语言编写一个真正单一的退出函数(异常是一种替代退出),因此,仅仅为了一些错误的理想而扭曲代码是没有意义的。关于这方面的更多观点,请参见。为什么不在PHP中使用
elseif
,而不是这个奇怪的
do..while
?在Python中,您可以使用
elif
(参见yurib的答案)执行同样的操作。我也考虑过这一点。但是提出一个例外是否太昂贵了?有一次,我试着做类似的事情。经过大量的谷歌搜索,最终的解决方案是这个。如果你找到更好的,请告诉我know@Jerry:这是一个错误的问题,它完全取决于您的用例。基准测试是唯一知道的方法。但是,例外情况适用于例外情况,它们不应用于这样的流量控制。更好的方法是使用try/finally和定期返回或中断退出。try-catch只应用于例外情况,而不是流量控制。
elif
s的+1,但是Python没有
switch
语句。@DzinX:这就是我刚才说的;)如果您想短接某些代码,例如查找文件、找到文件时打开文件、成功读取文件等,则此操作不起作用。然后您会得到大量嵌套的ifs,这很难读取。艾米尔斯泰克:这是对OP中例子的一个建议,因为你描述的try/finally可能更合适。我的观点是,在任何情况下,都有比我认为滥用
while
循环更好的解决方案。@yurib实际上,EmilStyrke描述的情况就是我所面临的。我遇到了许多嵌套的if语句和多个return语句。每次回来之前,当我需要做点什么的时候,我就被卡住了。但是尝试/最终是马上的。很明显,文章中的插图引起了更多的混乱,对此我深表歉意。谢谢大家~如果final中发生的只是清理(关闭文件、提交db事务等),请使用上下文管理器和
with
语句。我不知道final即使在返回后也会执行。我真是个新手。。。这就是我要找的,谢谢~
try:
    if ...: return
    ...
    if ...: return
    ...
finally:
    #Code to be executed on every return path (including exceptions) here