Python3中l(wèi)ambda表達(dá)式與函數(shù)式編程講解
簡(jiǎn)單來(lái)說(shuō),編程中提到的 lambda 表達(dá)式,通常是在需要一個(gè)函數(shù),但是又不想費(fèi)神去命名一個(gè)函數(shù)的場(chǎng)合下使用,也就是指匿名函數(shù)。其一般有如下幾種使用方式:
1、lambda的一般形式是關(guān)鍵字lambda后面跟一個(gè)或多個(gè)參數(shù),緊跟一個(gè)冒號(hào),以后是一個(gè)表達(dá)式。lambda是一個(gè)表達(dá)式而不是一個(gè)語(yǔ)句。它能夠出現(xiàn)在Python語(yǔ)法不允許def出現(xiàn)的地方。作為表達(dá)式,lambda返回一個(gè)值(即一個(gè)新的函數(shù))。lambda用來(lái)編寫(xiě)簡(jiǎn)單的函數(shù),而def用來(lái)處理更強(qiáng)大的任務(wù)。例如:
f = lambda x,y,z : x+y+z print f(1,2,3) g = lambda x,y=2,z=3 : x+y+z print g(1,z=4,y=5)
結(jié)果:
6
10
2、lambda表達(dá)式常用來(lái)編寫(xiě)跳轉(zhuǎn)表(jump table),就是行為的列表或字典。例如:
L = [(lambda x: x**2),
(lambda x: x**3),
(lambda x: x**4)]
print L[0](2),L[1](2),L[2](2)
D = {'f1':(lambda: 2+3),
'f2':(lambda: 2*3),
'f3':(lambda: 2**3)}
print D['f1'](),D['f2'](),D['f3']()
結(jié)果:
4 8 16
5 6 8
3、lambda表達(dá)式可以嵌套使用,但是從可讀性的角度來(lái)說(shuō),應(yīng)盡量避免使用嵌套的lambda表達(dá)式。
Lambda函數(shù)又稱匿名函數(shù),匿名函數(shù)就是沒(méi)有名字的函數(shù),函數(shù)沒(méi)有名字也行?當(dāng)然可以啦。有些函數(shù)如果只是臨時(shí)一用,而且它的業(yè)務(wù)邏輯也很簡(jiǎn)單時(shí),就沒(méi)必要非給它取個(gè)名字不可。lamdba函數(shù)的正確使用場(chǎng)景:
1、函數(shù)式編程
盡管Python算不上是一門純函數(shù)式編程語(yǔ)言,但它本身提供了很多函數(shù)式編程的特性,Python中,也有幾個(gè)定義好的全局函數(shù)方便使用的,像map、reduce、filter、sorted這些函數(shù)都支持函數(shù)作為參數(shù),lambda函數(shù)就可以應(yīng)用在函數(shù)式編程中。如下:
from functools import reduce foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] print (list(filter(lambda x: x % 3 == 0, foo))) #[18, 9, 24, 12, 27] print (list(map(lambda x: x * 2 + 10, foo))) #[14, 46, 28, 54, 44, 58, 26, 34, 64] print (reduce(lambda x, y: x + y, foo)) #139
2、閉包
閉包本身是一個(gè)晦澀難懂的概念,在這里我們以簡(jiǎn)單粗暴地理解為閉包就是一個(gè)定義在函數(shù)內(nèi)部的函數(shù),閉包使得變量即使脫離了該函數(shù)的作用域范圍也依然能被訪問(wèn)到。lambda函數(shù)作為閉包的例子:
>>> def my_add(n): ... return lambda x:x+n
>>> add_3 = my_add(3) >>> add_3(7) 10
這里lambda函數(shù)就是一個(gè)閉包,在全局作用域范圍中,add_3(7)可以正常執(zhí)行且返回值為10,之所以返回10是因?yàn)樵趍y_add局部作用域中,變量n的值在閉包的作用使得它在全局作用域也可以被訪問(wèn)到。
換成常規(guī)函數(shù)也可以實(shí)現(xiàn)閉包,只不過(guò)是這種方式稍顯啰嗦,如下:
>>> def my_add(n): ... def wrapper(x): ... return x+n ... return wrapper ... >>> add_5 = my_add(5) >>> add_5(2) 7
不過(guò)不是任何情況lambda函數(shù)都要比常規(guī)函數(shù)更清晰明了,看這個(gè)例子:
f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]
這是返回某個(gè)集合的所有子集的lambda函數(shù),相信你要看一會(huì)兒才能看明白。
python中有這樣一句話是Explicit is better than implicit(明了勝于晦澀)。若用lambda函數(shù)不能使代碼變得更清晰,就要考慮使用常規(guī)的方式來(lái)定義函數(shù)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
基于Tensorflow批量數(shù)據(jù)的輸入實(shí)現(xiàn)方式
今天小編就為大家分享一篇基于Tensorflow批量數(shù)據(jù)的輸入實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
Python圖片轉(zhuǎn)gif方式(將靜態(tài)圖轉(zhuǎn)化為分塊加載的動(dòng)態(tài)圖)
這篇文章主要介紹了Python圖片轉(zhuǎn)gif方式(將靜態(tài)圖轉(zhuǎn)化為分塊加載的動(dòng)態(tài)圖),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Python實(shí)現(xiàn)遍歷windows所有窗口并輸出窗口標(biāo)題的方法
這篇文章主要介紹了Python實(shí)現(xiàn)遍歷windows所有窗口并輸出窗口標(biāo)題的方法,涉及Python調(diào)用及遍歷windows窗口句柄的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
Python根據(jù)文件后綴實(shí)現(xiàn)文件夾整理
這篇文章主要為大家詳細(xì)介紹了Python如何根據(jù)文件后綴實(shí)現(xiàn)文件夾整理,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的可以參考下2024-02-02
詳解Python中RegEx在數(shù)據(jù)處理中的應(yīng)用
正則表達(dá)式(Regular?Expressions,簡(jiǎn)稱?RegEx)是一種強(qiáng)大的文本匹配和搜索工具,它在數(shù)據(jù)處理、文本解析和字符串操作中發(fā)揮著關(guān)鍵作用,下面就跟隨小編一起來(lái)了解一下RegEx的具體使用吧2024-01-01
基于python分享一款地理數(shù)據(jù)可視化神器keplergl
這篇文章主要介紹了分享一款地理數(shù)據(jù)可視化神器keplergl,keplergl是由Uber開(kāi)源的一款地理數(shù)據(jù)可視化工具,通過(guò)keplergl我們可以在Jupyter?notebook中使用,下文分享需要的小伙伴可以參考一下2022-02-02
numpy.ndarray 實(shí)現(xiàn)對(duì)特定行或列取值
今天小編就為大家分享一篇numpy.ndarray 實(shí)現(xiàn)對(duì)特定行或列取值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python BeautifulSoup中文亂碼問(wèn)題的2種解決方法
這篇文章主要介紹了Python BeautifulSoup中文亂碼問(wèn)題的2種解決方法,需要的朋友可以參考下2014-04-04
解決keras使用cov1D函數(shù)的輸入問(wèn)題
這篇文章主要介紹了解決keras使用cov1D函數(shù)的輸入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06

