簡體   English   中英

什么是有條件地返回函數的最pythonic方式

[英]What is the most pythonic way to conditionally return a function

說我有2個功能。 我希望func2返回func1 UNLESS func1返回None,在這種情況下func2返回其他內容。 我有兩種方法可以做到這一點,但他們都覺得有點不對勁。

我可以說:

def func1(n):
    if (condition):
        return foo

def func2(n):
    if func1(n) is not None:
        return func1(n)
    else:
        return something_else

但這感覺不對,因為我必須兩次調用func1(n)(並且func1(n)是一個更大的計算)。 為了解決這個問題,我可以說:

def func1(n):
    if (condition):
        return foo

def func2(n):
    foo = func1(n)
    if foo is not None:
        return foo
    else:
        return something_else

但這感覺不對,因為我認為我不應該分配一個永遠不會再次使用的新變量,只是為了檢查func1是否返回None。

有沒有更簡單的方法來執行此操作,我不必再調用func1兩次,而且我不必創建新變量? 如果這唯一的方法,你會推薦哪兩個? 我目前使用第二種方式(我將foo設置為func1返回的位置,而不是返回foo,除非foo == None)

另外,請記住,在我的實際代碼中,我調用了幾個不同的函數,我想返回第一個不是None的函數,這只是一個更簡單的代碼版本,可以解決問題。

由於None評估為False ,您可以執行以下操作:

def func2(n):
    return func1(n) or something_else

但是應該注意,如果func1(n)返回任何falsey( 0[]等),這將導致func2返回something_else


對於許多函數,您可以使用next和some generator表達式

def myfunc(n):
    vals = (f(n) for f in (func1, func2, func3...))
    return next((v for v in vals if v is not None), something_else)

給調用func1的結果命名是相對便宜的,所以我會這樣做,但是寫這樣的函數:

def func2(n):
    ret = func1(n)
    return ret if ret is not None else something_else

你肯定不想兩次調用func1 - 並且效率低下, func1可能有副作用或根據當時的狀態產生稍微不同的答案。

此外, return后不需要else ,因為return退出函數。

您的第二個選項的修訂版將是:

def func1(n):
    if condition:
        return foo

def func2(n):
    foo = func1(n)
    if foo is None:
        return something_else
    return foo

請注意,即使'func1'返回falsey值,這仍然有效。

或者,注意func1的內容,你能做到:

def func1(n):
    return foo

def func2(n):
    foo = func1(n)
    if condition:
        return foo
    return something_else

這取決於func1的實際內容實際上是什么。

根據您對iCodez的評論,與我之前的回答完全不同:

def func1(n):
    return ham

def func2(n):
    return jam

def func3(n):
    return spam

def mainfunc(n):
    for f in (func1, func2, func3):
        foo = f(n)
        if foo is not None:
            return foo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM