作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉(zhuǎn)載皂贩,也請(qǐng)保留這段聲明。謝謝!
秉承著一切皆對(duì)象的理念,我們?cè)俅位仡^來(lái)看函數(shù)(function)题翰。函數(shù)也是一個(gè)對(duì)象,具有屬性(可以使用dir()查詢)诈胜。作為對(duì)象豹障,它還可以賦值給其它對(duì)象名,或者作為參數(shù)傳遞焦匈。
lambda函數(shù)
在展開之前血公,我們先提一下lambda函數(shù)』菏欤可以利用lambda函數(shù)的語(yǔ)法累魔,定義函數(shù)。lambda例子如下:
func = lambda x,y: x + y
print func(3,4)
lambda生成一個(gè)函數(shù)對(duì)象够滑。該函數(shù)參數(shù)為x,y垦写,返回值為x+y。函數(shù)對(duì)象賦給func版述。func的調(diào)用與正常函數(shù)無(wú)異。
以上定義可以寫成以下形式:
def func(x, y):
return x + y
函數(shù)作為參數(shù)傳遞
函數(shù)可以作為一個(gè)對(duì)象寞冯,進(jìn)行參數(shù)傳遞渴析。函數(shù)名(比如func)即該對(duì)象。比如說(shuō):
def test(f, a, b):
print 'test'
print f(a, b)
test(func, 3, 5)
test函數(shù)的第一個(gè)參數(shù)f就是一個(gè)函數(shù)對(duì)象吮龄。將func傳遞給f俭茧,test中的f()就擁有了func()的功能。
我們因此可以提高程序的靈活性漓帚∧刚可以使用上面的test函數(shù),帶入不同的函數(shù)參數(shù)。比如:
test((lambda x,y: x**2 + y), 6, 9)
map()函數(shù)
map()是Python的內(nèi)置函數(shù)毡们。它的第一個(gè)參數(shù)是一個(gè)函數(shù)對(duì)象迅皇。
re = map((lambda x: x+3),[1,3,5,6])
這里,map()有兩個(gè)參數(shù)衙熔,一個(gè)是lambda所定義的函數(shù)對(duì)象登颓,一個(gè)是包含有多個(gè)元素的表。map()的功能是將函數(shù)對(duì)象依次作用于表的每一個(gè)元素红氯,每次作用的結(jié)果儲(chǔ)存于返回的表re中框咙。map通過(guò)讀入的函數(shù)(這里是lambda函數(shù))來(lái)操作數(shù)據(jù)(這里“數(shù)據(jù)”是表中的每一個(gè)元素,“操作”是對(duì)每個(gè)數(shù)據(jù)加3)痢甘。
在Python 3.X中喇嘱,map()的返回值是一個(gè)循環(huán)對(duì)象∪ぃ可以利用list()函數(shù)者铜,將該循環(huán)對(duì)象轉(zhuǎn)換成表。
如果作為參數(shù)的函數(shù)對(duì)象有多個(gè)參數(shù)构蹬,可使用下面的方式王暗,向map()傳遞函數(shù)參數(shù)的多個(gè)參數(shù):
re = map((lambda x,y: x+y),[1,2,3],[6,7,9])
map()將每次從兩個(gè)表中分別取出一個(gè)元素,帶入lambda所定義的函數(shù)庄敛。
filter()函數(shù)
filter函數(shù)的第一個(gè)參數(shù)也是一個(gè)函數(shù)對(duì)象俗壹。它也是將作為參數(shù)的函數(shù)對(duì)象作用于多個(gè)元素。如果函數(shù)對(duì)象返回的是True藻烤,則該次的元素被儲(chǔ)存于返回的表中绷雏。filter通過(guò)讀入的函數(shù)來(lái)篩選數(shù)據(jù)。同樣怖亭,在Python 3.X中涎显,filter返回的不是表,而是循環(huán)對(duì)象兴猩。
filter函數(shù)的使用如下例:
def func(a):
if a > 100:
return True
else:
return False
print filter(func,[10,56,101,500])
reduce()函數(shù)
reduce函數(shù)的第一個(gè)參數(shù)也是函數(shù)期吓,但有一個(gè)要求,就是這個(gè)函數(shù)自身能接收兩個(gè)參數(shù)倾芝。reduce可以累進(jìn)地將函數(shù)作用于各個(gè)參數(shù)讨勤。如下例:
print reduce((lambda x,y: x+y),[1,2,5,7,9])
reduce的第一個(gè)參數(shù)是lambda函數(shù),它接收兩個(gè)參數(shù)x,y, 返回x+y晨另。
reduce將表中的前兩個(gè)元素(1和2)傳遞給lambda函數(shù)潭千,得到3。該返回值(3)將作為lambda函數(shù)的第一個(gè)參數(shù)借尿,而表中的下一個(gè)元素(5)作為lambda函數(shù)的第二個(gè)參數(shù)刨晴,進(jìn)行下一次的對(duì)lambda函數(shù)的調(diào)用屉来,得到8。依次調(diào)用lambda函數(shù)狈癞,每次lambda函數(shù)的第一個(gè)參數(shù)是上一次運(yùn)算結(jié)果茄靠,而第二個(gè)參數(shù)為表中的下一個(gè)元素,直到表中沒(méi)有剩余元素亿驾。
上面例子嘹黔,相當(dāng)于(((1+2)+5)+7)+9
根據(jù)mmufhy的提醒: reduce()函數(shù)在3.0里面不能直接用的,它被定義在了functools包里面莫瞬,需要引入包儡蔓,見評(píng)論區(qū)。
總結(jié)
函數(shù)是一個(gè)對(duì)象
用lambda定義函數(shù)
map()
filter()
reduce()
整理不易疼邀,如果覺得有所幫助喂江,希望可以留下您的精彩言論再走。趕快為你們最喜歡的框架打Call吧旁振。
大家如果想要學(xué)習(xí)Python可以加我的Qun:834179111获询,小編整理了2018最新的學(xué)習(xí)資料和大神分享直播。歡迎還沒(méi)有找到方向的小伙伴來(lái)學(xué)習(xí)拐袜。