lambda expression
又被稱為statement
荒揣,功能是:用來(lái)構(gòu)造function
形式
lambda x, y:x + y
lambda
是關(guān)鍵字,x, y
是生成的函數(shù)的參數(shù),可以沒有參數(shù),右邊的x + y
是函數(shù)的返回值
示例
data = [x for x in range(10)]
t = list(filter(lambda x:x%2==0, data))
print(t)
-----result-----
[0, 2, 4, 6, 8]
解釋一下filter
的功能:
filter(func, datalist)
接收兩個(gè)參數(shù)室琢,第一個(gè)參數(shù)是一個(gè)函數(shù)func
,filter
將會(huì)對(duì)第二個(gè)參數(shù)里面的每一個(gè)元素調(diào)用func
落追,調(diào)用結(jié)果為真的元素將一起被返回
說到lambda
就免不了說filter, map & reduce
這三個(gè)函數(shù)盈滴,因?yàn)檫@三個(gè)函數(shù)都是接收一個(gè)函數(shù)作參數(shù)
map(func, datalist)
將func
應(yīng)用于datalist
的全部元素并返回處理之后的元素
示例
datalist = [1, 2, 3, 4]
list_new = list(map(lambda x:x**2, datalist))
print(list_new)
----
[1, 4, 9, 16]
reduce(func, datalist)
對(duì)datalist
里的元素進(jìn)行成對(duì)的操作,第一次操作的結(jié)果和第三個(gè)元素一起傳入func
依次類推
示例
from functools import reduce
datalist = [1, 2, 3, 4]
data = reduce(lambda x, y:x*y , datalist)
print(data)
-----
24
使用reduce
需要import轿钠,據(jù)說是Guido van Rossum討厭lambda哈哈
下面回到lambda
以下內(nèi)容基于這篇文章, 個(gè)人覺得寫得挺透徹的
注意事項(xiàng)
lambda x:x**2
:
右邊一定要是一個(gè)可以賦值給變量的expression巢钓,即使這個(gè)expression的值是None
例如:
lambda x:x*2
lambda x:x+3
lambda x:print(x)
上面的示例都是可以的,其中print返回的是None
為什么用lambda
其實(shí)lambda也不一定非用不可疗垛,比如上面map的功能就可以這樣實(shí)現(xiàn)
data = [x**2 for x in datalist]
但是有時(shí)候用lambda卻是非常方便的症汹,例如下面這個(gè)我在文章里看到的例子
def __init__(self, parent):
"""Constructor"""
frame = tk.Frame(parent)
frame.pack()
btn22 = tk.Button(frame,
text="22", command=lambda: self.printNum(22))
btn22.pack(side=tk.LEFT)
btn44 = tk.Button(frame,
text="44", command=lambda: self.printNum(44))
btn44.pack(side=tk.LEFT)
對(duì)比一下沒有用lambda的
def __init__(self, parent):
"""Constructor"""
frame = tk.Frame(parent)
frame.pack()
btn22 = tk.Button(frame,
text="22", command=self.buttonCmd22)
btn22.pack(side=tk.LEFT)
btn44 = tk.Button(frame,
text="44", command=self.buttonCmd44)
btn44.pack(side=tk.LEFT)
def buttonCmd22(self):
self.printNum(22)
def buttonCmd44(self):
self.printNum(44)
原文:
The thing to remember here is that a tk.Button expects a function object as an argument to the command parameter. That function object will be the function that the button calls when it (the button) is clicked. Basically, that function specifies what the GUI will do when the button is clicked.
So we must pass a function object in to a button via the *command *parameter. And note that — since different buttons do different things — we need a different function object for each button object. Each function will be used only once, by the particular button to which it is being supplied.