【ZZ】Python lambda

a = [(1, 2), (3, 1), (5, 10), (11, -3)]
    Python lambda

Python支持一種有趣的語法,它容許你快速定義單行的最小函數。這些叫作lambda函數,是從Lisp借鑑來的,能夠用在任何須要函數的地方。 python

lambda函數也叫 匿名函數,即,函數沒有具體的名稱。
總的來講,lambda函數能夠 接收任意多個參數而且 返回單個表達式的值。lambda函數不能包含命令, 包含的表達式不能超過一個。不要試圖向 lambda函數中塞入太多的東西;若是你須要更復雜的東西,應該定義一個普通函數,而後想讓它多長就多長。(固然,太長的函數也是不推薦的)

lambda函數是一種風格問題。不必定非要使用它們;任意可以使用它們的地方,均可以定義一個單獨的普通函數來進行替換。通常將它們用在須要封裝的特殊的,非重用代碼上,避免令代碼中充斥着大量的單行函數。 編程

lambda示例:
# 普通函數
def f(x):
    return x*2

>>>f(3)
6

# lambda函數
func = lambda x: x*2
>>>func(3)
6
>>>(lambda x: x*2)(3)
6

爲什麼使用lambda函數

今天在stackoverflow看到有人提問說Python中爲什麼使用lambda函數呢?咱們能夠從python doc中找到它的使用語法,而且一般我也會被告知能夠從函數直接調用lambda函數,顯得簡潔。可是假若你真的沒有真正使用過這個函數,真的很難找到lambda的魅力所在。由於傳統編程習慣中,咱們老是爲了最求某些簡潔而把代碼寫的很難理解。 函數

咱們來看一個例子:簡單的排序,咱們要把: spa

a =[2,1,3]

這裏列表逆序排列,即從大到小排序。咱們可使用sorted函數,很簡單: code

print sorted(a,reverse=True)

簡單的一句就能夠搞定了。若是非要在着當中使用lambda函數該如何呢? 對象

print sorted(a,lambda a,b: -cmp(a,b))

這行語句一樣達到了效果。可是相比以前的設置reverse=True,後面的lambda….-com(a,b)顯得就讓人沒法理解了。那麼lambda函數到底有何用呢,是否是跟普通函數相比僅僅是省去了函數名,因此它一般也被稱爲「匿名函數」。同時這樣的匿名函數,又不能共享在別的地方調用。其實說的沒錯,lambda在Python這種動態的語言中確實沒有起到什麼驚天動地的做用,由於有不少 別的方法可以代替lambda。同時,使用lambda的寫法有時顯得並無那麼pythonic。甚至有人提出以後的Python版本要取消 lambda。 blog

回過頭來想一想,Python中的lambda真的沒有用武之地嗎?其實不是的,至少我能想到的點,主要有: 排序

1. 使用Python寫一些執行腳本時,使用lambda能夠省去定義函數的過程,讓代碼更加精簡。 get

2. 對於一些抽象的,不會別的地方再複用的函數,有時候給函數起個名字也是個難題,使用lambda不須要考慮命名的問題。 io

3. 使用lambda在某些時候讓代碼更容易理解。

(上段文字摘自《Python每天美味》)

也許咱們剛纔舉的例子是用了牛刀來殺機了,有些不合適。接下來看看lambad有些場合能帶給你那些便利和驚喜。

補充下基礎知識:lambda語句中,冒號前是參數,能夠有多個,用逗號隔開,冒號右邊的返回值。lambda語句構建的實際上是一個函數對象,見證一下:

>>> a = lambda x: x** 2
>>> print a
function <lambda> at 0x029DDE70>

接着舉例,對

a = [(1, 2), (3, 1), (5, 10), (11, -3)]

進行排序。咱們分別使用常規自定義函數和lambda函數進行比較,分別爲:

def key(x):
     return x[1]   
a = [(1, 2), (3, 1), (5, 10), (11, -3)]
a.sort(key=key)

a = [(1, 2), (3, 1), (5, 10), (11, -3)] 
a.sort(key=lambda x: x[1])

這裏很明顯省去了某些函數的定義。可是前提你要明白lambda的工做原理。還有lambda還能夠跟python的filter,map以及reduce函數結合使用,達到某種計算要求。

>>> data = [1,2,3,4,5]
>>> print filter(lambda x : x % 2 ==0,data)
[2, 4]
>>> print map(lambda x:x *2,data)
[2, 4, 6, 8, 10]
>>> print reduce(lambda x,y: x+y, data)
15

固然也不是非要用lambda函數不可,前面的map咱們能夠寫成

print [x * 2  for x in data]

同樣的道理,其餘兩個函數均可以本身自定義。因此到底用不用lambda函數,自行斟酌。最後附上網上看到python用lambda求階乘的代碼,此次你也許會驚訝些:

print   reduce(lambda   x,y:x*y,   range(1,   1001))
相關文章
相關標籤/搜索