2017-06-12 23 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和呼叫(並返回結果),另一個函數如果不是。

相關問題