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