Python函數式程式設計:傳回函數與匿名函數

WBOY
發布: 2023-04-12 14:37:20
轉載
1310 人瀏覽過

Python函數式程式設計:傳回函數與匿名函數


回傳函數

#所謂回傳函數,顧名思義,就是把函數當作回傳值。高階函數除了可以將函數當作參數之外,還可以將函數傳回作為結果。下面來實現一個可變參數的連乘,求積函數可定義為:

def calc_fac(*args):
fx = 0
for n in args:
fx = fx * n
return fx
登入後複製

很多時候當求積函數定義好後我們並不需要立即求積,而是會根據後面的計算再行調用。這時,我們就可以先不回傳函數的結果,而是將函數本身傳回,如下可見:

def lazy_fac(*args):
 def fac():
 fx = 0
 for n in args:
 fx = fx * n
 return fx
return fac
登入後複製

重新定義求積函數後,當我們呼叫lazy_fac()時,傳回的就不是求積的結果啦,而是求積函數:

>>> a=lazy_fac(1,2,3,4)
>>> a
<function lazy_fac.<locals>.fac at 0x002a5dr42>
登入後複製

而當呼叫函數a 時,求積過程才被執行:

>>> a()
24
登入後複製

此例中,我們在函數lazy_fac中又定義了函數fac,fac可稱做內部函數,而lazy_fac為外部函數。內部函數fac可以引用外部函數的參數和局部變數。參數和變數都保存在我們最後回傳的內部函數fac中。這種程式結構在Python上我們稱之為閉包。

在閉包結構中,函數作為結果傳回時,函數過程並沒有立刻執行,而是等我們呼叫 a( )後才執行。

總之,在函數式程式設計裡,函數除了可以傳回一個計算結果之外,也可以傳回一個未執行的函數。當傳回函數時,始終牢記該函數並未被執行,返回函數中盡量不要引入循環變數等可能引起變化的變數。

匿名函數

當我們在傳入函數時或程式碼結構過於複雜時,我們可以透過匿名函數來取代明確的函數定義。此時,匿名函數會大幅簡化程式碼結構,可以使之更精煉。

以先前介紹的map 函數為例來計算x3 看看匿名函數的功能:

>>> list(map(lambda x: x * x * x, [1, 2, 3]))
[1, 8, 27]
登入後複製

對比可以看出,匿名函數lambda x : x*x*x 就相當於:

def f(x):
 return x * x * x
登入後複製

lambda作為匿名函數的關鍵字,冒號前面的x 表示匿名函數的參數。匿名函數只能有一個表達式,無需像定義函數那樣寫 return。因為匿名函數沒有函數名,在使用過程中就不需要擔心函數名的衝突。匿名函數作為一個函數對象,也符合向變數賦值的規則:

>>> fx = lambda x: x * x * x
>>> fx
<function <lambda> at 0x101c6ef28>
>>> f(4)
64
登入後複製

同樣,匿名函數作為一個函數也可以被當成返回函數:

def f(x):
 return lambda: x * x * x
登入後複製

以上是Python函數式程式設計:傳回函數與匿名函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板