python中lambda函數的理解與使用

Lambda函數,即Lambda 表達式(lambda expression),是一個匿名函數(不存在函數名的函數),Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction)。

入門Python的朋友會問,函數沒有名字也可以嗎?

當然可以。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單(比如做個簡單加法、取絕對值、簡單過濾等)時,就沒必要非給它取個名字。在做大的Python項目開發中,過多的函數名會影響代碼的可讀性。

In[1]:  lambda x,y:x+y
Out[1]: <function __main__.<lambda>>

x和y是函數的兩個參數,冒號後面的表達式(x+y)是函數返回值,很明顯,這個函數就是求兩個變量的和,這裏暫且給這個匿名函數綁定一個名字,這樣使得我們調用匿名函數成爲可能。

>> add = lambda x,y:x+y
>> add(3,4)
>> 7

它等同於常規函數:

>>> def add2(x, y):
...     return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)

接下來給大家介紹一些lambda函數的使用場景:

1 函數式編程

例如:一個整數列表,要求按照列表中元素的絕對值大小升序排列
>>> my_list = [3,5,-4,-1,0,-2,-6]
>>> sorted(my_list, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函數sorted支持接收一個函數作爲參數,該參數作爲 sorted的排序依據,這裏按照列表元素的絕對值進行排序。
當然,我也可以用普通函數來實現:
>>> def foo(x):
...     return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]
只不過是這種方式代碼看起來不夠 Pythonic 而已。

lambda:這是Python支持一種有趣的語法,它允許你快速定義單行的最小函數,可以用在任何需要函數的地方:
>>> add = lambda x,y : x+y
>>> add(5,6)
>>> (lambda x,y:x+y)(5,6)

2 filter、map、reduce

Python中最常見的filter篩選、map小刷子、reduce合併,都可以用lambda表達式來生成。

對於序列來講,有三個函數式編程工具: filter()、map()和reduce()

# map(function,sequence):把sequence中的值當參數逐個傳給function,返回一個包含函數執行結果的list。如果function有兩個參數,即map(function,sequence1,sequence2)。
# 求1~20的平方
>>> list(map(lambda x:x*x,range(1,21))) 
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

# filter(function,sequence):對sequence中的item依次執行function(item),將執行結果爲True的item組成一個List/String/Tuple(取決於sequence的類型)返回。
 
# 求1~20之間的偶數
>>> list(filter(lambda x:x%2 == 0,range(1,21)))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

reduce(function,sequence):function接收的參數個數只能爲2,先把sequence中第一個值和第二個值當參數傳給function,再把function的返回值和第三個值當參數傳給function,然後只返回一個結果。
 
#求1~100之和
>>> from functools import reduce          #Python3.x之後需要導入reduce模塊
>>> reduce(lambda x,y:x+y,range(1,101))

#求1~100之和,再加上10000
>>> reduce(lambda x,y:x+y,range(1,101),10000)

3 閉包

閉包:一個定義在函數內部的函數,閉包使得變量即使脫離了該函數的作用域範圍也依然能被訪問到。

來看一個用lambda函數作爲閉包的例子。
>>> def add(n):
...     return lambda x:x+n
...
>>> add2 = add(5)
>>> add2(15)


發佈了38 篇原創文章 · 獲贊 61 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章