使用函数的返回值,如果满足条件,而无需使用一个额外的变量
假设一个函数some_function(x)
返回一个整数,我目前做如下:使用函数的返回值,如果满足条件,而无需使用一个额外的变量
def another_function():
# stuff...
result = some_function(x)
if result != 0:
return result
# else: more stuff (unrelated to result)...
我想要的是找到最佳写作方式
if some_function(x) != 0:
return some_function(x)
当然没有叫some_function(x)
两次。
有没有更多的“聪明”的地道方式来写在Python 3中,没有使用result
?
由于您在少数地方处理结果,因此您必须运行两次或保存到变量中。
另一种选择(这是类似于使用result
)是通过使用“”和“”语句并继续else
部分:
with some_function(x) as result:
if result: return result
这句法不会让结果变量以后。
函数不会自动转换为上下文管理器,通过尝试使用它们......以及由上下文管理器定义的FWIW变量(在这里它将是'result')DO outlive 'with'块,所以它仍然会'稍后保持结果变量'。 –
另一种选择是定义一个异常,当函数给出0时引发结果。如果是这样的话,赶上错误并做其他事情。
class ZeroResult(Exception):
def __init__(self):
raise AttributeError
def some_function(x):
#...
if result==0:
raise ZeroResult
else:
return result
def another_function():
# stuff
try:
return some_function(x)
except ZeroResult:
# more stuff
我会在回复中回复我的评论,并建议您目前正在做的是最好的方法。
Dimgolds的答案,如果你继续并实施一个C.M,几乎可以归结为做同样的事情。 FLabs方法使用一个异常,如果情况并非例外,则引入不需要的开销。
你在做什么是简单的,明确的和完全可以理解的; Python中惯用的东西。继续这样做。
def mem(f, *args, **kwargs):
r = f(*args, **kwargs)
return r
def foo():
print("hi, i'm here once")
return 1
def bar(a,b):
print("also once")
return a+b
somefunc_with_foo = mem(foo)
print(somefunc_with_foo)
print(somefunc_with_foo)
somefunc_with_bar_2_3 = mem(bar,2,3)
print(somefunc_with_bar_2_3)
print(somefunc_with_bar_2_3)
我不认为额外的可爱是值得的,但如果你想你可以做2个功能。
return some_function(x) or my_other_stuff_that_gets_run_if_zero(x, y, z)
布尔快捷键将返回结果马上就some_function(x)
truthy和呼叫(并返回结果),另一个函数如果不是。
为什么要聪明?你有什么很好,清楚并做好这项工作。我们往往对我们自己有时太聪明:-) –
聪明的惯用方式就是你已经拥有的。没有进一步... –
@JimFasarakisHilliard我同意:> – direprobs