a = [(1, 2), (3, 1), (5, 10), (11, -3)]Python lambda
Python支持一種有趣的語法,它容許你快速定義單行的最小函數。這些叫作lambda函數,是從Lisp借鑑來的,能夠用在任何須要函數的地方。 python
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))