2017-06-12 33 views
2

假设一个函数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

+7

为什么要聪明?你有什么很好,清楚并做好这项工作。我们往往对我们自己有时太聪明:-) –

+1

聪明的惯用方式就是你已经拥有的。没有进一步... –

+1

@JimFasarakisHilliard我同意:> – direprobs

回答

0

由于您在少数地方处理结果,因此您必须运行两次或保存到变量中。

另一种选择(这是类似于使用result)是通过使用“”和“”语句并继续else部分:

with some_function(x) as result: 
    if result: return result 

这句法不会让结果变量以后。

+2

函数不会自动转换为上下文管理器,通过尝试使用它们......以及由上下文管理器定义的FWIW变量(在这里它将是'result')DO outlive 'with'块,所以它仍然会'稍后保持结果变量'。 –

1

另一种选择是定义一个异常,当函数给出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 
1

我会在回复中回复我的评论,并建议您目前正在做的是最好的方法。

Dimgolds的答案,如果你继续并实施一个C.M,几乎可以归结为做同样的事情。 FLabs方法使用一个异常,如果情况并非例外,则引入不需要的开销。

你在做什么是简单的,明确的和完全可以理解的; Python中惯用的东西。继续这样做。

0
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) 
0

我不认为额外的可爱是值得的,但如果你想你可以做2个功能。

return some_function(x) or my_other_stuff_that_gets_run_if_zero(x, y, z) 

布尔快捷键将返回结果马上就some_function(x) truthy和呼叫(并返回结果),另一个函数如果不是。

相关问题