Python 中的匿名函數

匿名也就是沒有名字,函數爲什麼要匿名呢?

有沒有感覺每次爲函數取名都是件很悲劇的事情,想取個像樣點的函數名很摳腦殼。

如果某個函數我們只需要使用一次的時候,還需要取名是不是就更悲劇了?

Python 與 JavaScript 支持函數本身作爲另外函數的參數傳入。這就導致了 Python 中有很多地方高階函數在使用時,需要傳入一個函數。這種時候,函數只在調用高階函數的時候使用一次。

Python 對匿名函數屬於有限支持:

  • 匿名函數以 lambda 關鍵字標識
  • 匿名函數是一個表達式而不是語句塊,所以只能寫成一條語句
  • 匿名函數不能寫 return 語句,整個 lambda 表達式的結果就是返回值

綜上,匿名函數可以實現的邏輯是相對有限的。

匿名函數 lambda 表達式的寫法:lambda 參數: 返回值

比如:

lambda x: x+1

x 是參數, x+1 是其返回值。相當於:

def f(x):
	return x+1

如果多個參數,用逗號分隔參數:

lambda x,y: x+y

# == 相當於 ==

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

lambda 表達式運行結果是一個函數對象(類似<function <lambda> at 0x00...0>),只能使用一次,當然你也可以用變量存下來一直使用:

fn = lambda x,y: x+y
print(fn(3, 4))
## 7

常規使用呢,比如我們要對這樣一個列表[['y', 2], ['z', 1], ['x', 0]]基於每個子列表的第二個元素(數字)排序。我們一般列表排序,直接調用列表的 sort() 方法即可,sort() 方法的 key 參數可以接收一個函數,並基於函數的返回值進行排序。

>>> l = [['y', 2], ['z', 1], ['x', 0]]
>>> l.sort(key=lambda x:x[1]) # => 爲key傳遞匿名函數
>>> l
## [['x', 0], ['z', 1], ['y', 2]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章