匿名也就是沒有名字,函數爲什麼要匿名呢?
有沒有感覺每次爲函數取名都是件很悲劇的事情,想取個像樣點的函數名很摳腦殼。
如果某個函數我們只需要使用一次的時候,還需要取名是不是就更悲劇了?
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]]