Python中的匿名函數(shù)

在Python中,有時候我們需要一個簡單的函數(shù)去返回一些結(jié)果,但是我們又不想通過 def 專門去定義函數(shù)再引用,這種情況下有沒有好的辦法來完成呢?

答案是使用匿名函數(shù),而Python中的匿名函數(shù)通過 lambda 表達式來完成。

匿名函數(shù)的使用

當(dāng)我們使用匿名函數(shù)時, lambda 只是一個表達式,它并不是一個代碼塊,比如我們使用 map() 函數(shù) 和 lambda 來實現(xiàn)計算一個數(shù)的平方:

>>> list(map(lambda x: x * x, [1, 2, 3, 4]))
[1, 4, 9, 16]

在上面的 lambda 表達式中,我們并沒有給其定義函數(shù)名,但其仍然能夠正常執(zhí)行。也就是說,我們在這里定義的是一個匿名函數(shù):lambda x: x * x ,其中 lambda x是匿名函數(shù)的聲明部分,而 x * x則是匿名函數(shù)的實現(xiàn)部分,且不需要寫 return 語句。它其實等價于下面這個普通函數(shù):

def demo1(x):
    return x * x

我們把這個匿名函數(shù)作為一個參數(shù)傳遞給 map() ,而 map() 中會把它看作一個和普通函數(shù)一樣的函數(shù),從而進一步進行處理。同理,我們還可以把匿名函數(shù)賦值給一個變量,然后通過變量來調(diào)用函數(shù),請看下面的例子:

a, b = 10, 20
sum = lambda x, y: x + y
print(sum)
print(sum(a, b))

執(zhí)行結(jié)果如下:

<function <lambda> at 0x000001F18AC9C268>
30

可以發(fā)現(xiàn),上面的 sum 就是一個匿名函數(shù),我們并沒有寫 return 語句,但依然能夠返回結(jié)果。lambda x, y是匿名函數(shù)的聲明部分,而 x + y則是匿名函數(shù)的實現(xiàn)部分。它其實等價于下面這個普通函數(shù):

def demo2(x, y):
    return x + y

匿名函數(shù)和普通函數(shù)的區(qū)別

我們使用匿名函數(shù)時,一行代碼就能夠搞定了,那是不是所有的普通函數(shù)都應(yīng)該替換成匿名函數(shù)呢?

答案肯定是不行的,盡管我們使用 lambda 表達式來定義簡單的函數(shù),但它的使用具有一定的局限性。匿名函數(shù)和普通函數(shù)之間,主要有以下幾點區(qū)別:

  • 定義普通函數(shù)時,必須要有函數(shù)名標識,而匿名函數(shù)則不需要有函數(shù)名來標識;
  • 普通函數(shù)中的函數(shù)體實現(xiàn)部分,可以有多條語句,而匿名函數(shù)則只能是一個表達式;
  • 普通函數(shù)可以用于實現(xiàn)很復(fù)雜的功能邏輯處理,而匿名函數(shù)一般用于實現(xiàn)一些簡單的功能;
  • 如果函數(shù)可能會被多次調(diào)用時,最好使用普通函數(shù),在非多次調(diào)用的情況下才建議使用匿名函數(shù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容