[英]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.