国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python 進(jìn)階之路 (六) 九淺一深 lambda,陳獨(dú)秀你給我坐下!

WelliJhon / 2057人閱讀

摘要:好啦,首先讓我們先搞明白基礎(chǔ)定義,到底是什么表達(dá)了中用于創(chuàng)建匿名函數(shù)的特殊語(yǔ)法。其實(shí)總結(jié)起來(lái),可以理解為一個(gè)小的匿名函數(shù),函數(shù)可以使用任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。

lambda是什么

大家好,今天給大家?guī)?lái)的是有關(guān)于Python里面的lambda表達(dá)式詳細(xì)解析。lambda在Python里面的用處很廣,但說(shuō)實(shí)話,我個(gè)人認(rèn)為有關(guān)于lambda的討論不是如何使用的問(wèn)題,而是該不該用的問(wèn)題。接下來(lái)還是通過(guò)大量實(shí)例和大家分享我的學(xué)習(xí)體驗(yàn),可能最后你也會(huì)得出和我一樣的結(jié)論。

好啦,首先讓我們先搞明白基礎(chǔ)定義,lambda到底是什么?

Lambda表達(dá)了Python中用于創(chuàng)建匿名函數(shù)的特殊語(yǔ)法。我們將lambda語(yǔ)法本身稱為lambda表達(dá)式,從這里得到的函數(shù)稱之為lambda函數(shù)。

其實(shí)總結(jié)起來(lái),lambda可以理解為一個(gè)小的匿名函數(shù),lambda函數(shù)可以使用任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。估計(jì)有JavaScript ES6經(jīng)驗(yàn)的朋友們聽上去會(huì)很親切,具體函數(shù)表達(dá)式如下:

模板: lambda argument: manipulate(argument)

參數(shù):argument就是這個(gè)匿名函數(shù)傳入的參數(shù),冒號(hào)后面是我們對(duì)這個(gè)參數(shù)的操作方法

讓我們參考上面的定義模板和參數(shù), 直接看一個(gè)最簡(jiǎn)單的例子:

add_one = lambda x:x+1       # 1個(gè)參數(shù),執(zhí)行操作為+1
add_nums = lambda x,y:x+y    # 2個(gè)參數(shù),執(zhí)行操作為相加

print(add_one(2))            # 調(diào)用add_one
print(add_nums(3,7))         # 調(diào)用add_nums

>>>   3 
     10

相比大家已經(jīng)發(fā)現(xiàn)lambda匿名函數(shù)的特點(diǎn)了,就是對(duì)于較為簡(jiǎn)單的功能,無(wú)需自己def一個(gè)了,單行就可以寫下,傳參和執(zhí)行方法一氣呵成

lambda用法詳解

接下來(lái)讓我們看看lambda的實(shí)際應(yīng)用,就我自己使用lambda的體驗(yàn)來(lái)說(shuō),從來(lái)沒(méi)有多帶帶用過(guò),lambda一般情況下是和map,filter,reduce這些超棒的內(nèi)置函數(shù)以及dict,list,tuple,set 等數(shù)據(jù)結(jié)構(gòu)混用,這樣才能發(fā)揮它的最大效果,如果有朋友還不太熟悉這些內(nèi)置函數(shù),可以看一下我上一篇文章 Python 進(jìn)階之路 (五) map, filter, reduce, zip 一網(wǎng)打盡

好了,閑話少說(shuō),下面讓我們一個(gè)個(gè)來(lái)看

lambda + map

首先出場(chǎng)的是lambda+map的組合,先看下面這個(gè)例子:

numbers = [1,2,3,4,5]
add_one = list(map(lambda n:n+1,numbers))  #map(fun,sequence)

print(list(add_one))
print(tuple(add_one))

Out: [2, 3, 4, 5, 6]
     (2, 3, 4, 5, 6)

這個(gè)是我們上一期的例子,實(shí)現(xiàn)一個(gè)數(shù)組(元組)每個(gè)元素+1,讓我們回憶一下map的用法
map(fun,sequence),fun是傳遞的方法,sequence是一個(gè)可迭代的序列,這里我們的fun就是匿名函數(shù)
lambda n:n+1,這里非常完美的解釋了lambda的設(shè)計(jì)初衷,因?yàn)槿绻麤](méi)有l(wèi)ambda,我們的解決方案是這樣:

def add(num):
    return num+1

numbers = [1,2,3,4,5]
add_one = list(map(add,numbers))
print(add_one)
print(tuple(add_one))

顯然易見,這里的add方法有點(diǎn)多余,所以用lambda代替是個(gè)好的選擇。讓我們?cè)倏聪乱粋€(gè)例子,這是我自己備份日志時(shí)寫的一小段代碼,命名不是很規(guī)范:

from datetime import datetime as dt
logs = ["serverLog","appLog","paymentLog"]
format ="_{}.py".format(dt.now().strftime("%d-%m-%y"))
result =list(map(lambda x:x+format,logs))   # 利用map+lambda 實(shí)現(xiàn)字符串拼接
print(result)

Out:["serverLog_11-02-19.py", "appLog_11-02-19.py", "paymentLog_11-02-19.py"]

這里和剛才的加1例子差不多,但是換成了字符串的拼接,然而我這里用lambda并不是很好的解決方案,最后我們會(huì)說(shuō),現(xiàn)在大家應(yīng)該對(duì)map + lambda 有一些感覺了,讓我們?cè)賮?lái)個(gè)和dict字典互動(dòng)的例子:

person =[{"name":"Lilei",
          "city":"beijing"},
         {"name":"HanMeiMei",
          "city":"shanghai"}]

names=list(map(lambda x:x["name"],person))
print(names)

Out:["Lilei", "HanMeiMei"]

好了,看到這里對(duì)于map+lambda的用法大家已經(jīng)很清楚了應(yīng)該~

lambda + filter

lambda和filter的組合也很常見,用于特定篩選條件下,現(xiàn)在讓我們來(lái)看上篇文章filter的例子,就應(yīng)該很好理解了:

numbers = [0, 1, 2, -3, 5, -8, 13]

# 提取奇數(shù)
result = filter(lambda x: x % 2, numbers)
print("Odd Numbers are :",list(result))

# 提取偶數(shù)
result = filter(lambda x: x % 2 == 0, numbers)
print("Even Numbers are :",list(result))

#提取正數(shù)
result = filter(lambda x: x>0, numbers)
print("Positive Numbers are :",list(result))

Out:Odd Numbers are : [1, -3, 5, 13]
     Even Numbers are : [0, 2, -8]
     Positive Numbers are : [1, 2, 5, 13]

這里無(wú)非就是我們把filter(fun,sequence)里面的fun換成了我們的lambda,只是lambda的函數(shù)部分(x%2,x%2==0,x>0)都是可以返回True或者False來(lái)判斷的,符合fiter的要求,用剛才李雷和韓梅梅的例子也是一個(gè)道理:

person =[{"name":"Lilei",
          "city":"beijing"},
         {"name":"HanMeiMei",
          "city":"shanghai"}]

names=list(filter(lambda x:x["name"]=="Lilei",person)) # 提取李雷的信息
print(names)

Out:[{"name": "Lilei", "city": "beijing"}]
lambda + reduce

還是讓我們看一下上篇文章的例子:

from functools import reduce          # Only Python 3
numbers = [1,2,3,4]
result_multiply = reduce((lambda x, y: x * y), numbers)
result_add = reduce((lambda x,y: x+y), numbers)

print(result_multiply)
print(result_add)

Out:24
     10

這個(gè)例子用lambda和reduce的配合實(shí)現(xiàn)了list求累積和和累積乘法。
有意思的是這個(gè)例子具有兩面性,一方面展示了lambda和reduce如何一起使用,另一方面也引出了接下來(lái)我想說(shuō)的重點(diǎn):lambda真的值得用嗎?到底應(yīng)該怎么用?

避免過(guò)度使用lambda

通過(guò)上面的例子大家已經(jīng)看到了lambda的實(shí)際應(yīng)用場(chǎng)景,但是這里我想和大家分享一下我的看法:我認(rèn)為lambda的缺點(diǎn)略多于優(yōu)點(diǎn),應(yīng)該避免過(guò)度使用lambda

首先,這僅僅是我的個(gè)人看法哈,希望大家理解,我為什么這么說(shuō)呢,首先讓我們拿lambda方法和常規(guī)def做個(gè)對(duì)比,我發(fā)現(xiàn)lambda和def的主要不同點(diǎn)如下:

可以立即傳遞(無(wú)需變量)

只需一行代碼,簡(jiǎn)潔(未必高效)

可以會(huì)自動(dòng)返回,無(wú)需return

lambda函數(shù)沒(méi)有函數(shù)名稱

有關(guān)優(yōu)點(diǎn)大家都可以看到,我主要想說(shuō)一下它的缺點(diǎn),首先,從真正需求出發(fā),我們?cè)诖蠖鄶?shù)時(shí)候是不需要lambda的,因?yàn)榭偪梢哉业礁玫奶娲椒?/strong>,現(xiàn)在我們一起看一下剛才lambda+reduce 的例子,我們用lambada實(shí)現(xiàn)的結(jié)果如下:

from functools import reduce          # Only Python 3
    numbers = [1,2,3,4]
    result_multiply = reduce((lambda x, y: x * y), numbers)
    result_add = reduce((lambda x,y: x+y), numbers)

這里用lambda并沒(méi)有實(shí)現(xiàn)簡(jiǎn)單高效的目的,因?yàn)槲覀冇鞋F(xiàn)成的sum和mul方法可以用:

from functools import reduce
from operator import mul

numbers = [1,2,3,4]
result_add = sum(numbers)
result_multiply =reduce(mul,numbers)

print(result_add)
print(result_multiply)

Out: 10
     24

結(jié)果是一樣的,但是顯然用sum和mul的方案更加高效。再舉個(gè)常見的例子說(shuō)明,假如我們有一個(gè)list存儲(chǔ)了各種顏色,現(xiàn)在要求把每個(gè)顏色首字母大寫,如果用lambda寫出是這樣:

colors = ["red","purple","green","blue"]
result = map(lambda c:c.capitalize(),colors)
print(list(result))

Out:["Red", "Purple", "Green", "Blue"]

看著似乎不錯(cuò),挺簡(jiǎn)潔的,但是我們有更好的方法:

colors = ["red","purple","green","blue"]
result = [c.capitalize() for c in colors]
print(result)

Out:["Red", "Purple", "Green", "Blue"]

用sorted還能處理首字母不規(guī)范的情況,連排序都省了:

colors = ["Red","purple","Green","blue"]
print(sorted(colors,key=str.capitalize))

Out:["blue", "Green", "purple", "Red"]

還有一個(gè)主要原因就是: lambda函數(shù)沒(méi)有函數(shù)名稱。所以在代碼交接,項(xiàng)目移植的場(chǎng)景中會(huì)給團(tuán)隊(duì)帶來(lái)很多困難,多寫個(gè)函數(shù)add_one()沒(méi)什么壞處,因?yàn)榇蠹叶己苋菀桌斫猓浪菆?zhí)行+1的功能,但是如果團(tuán)隊(duì)里你在自己負(fù)責(zé)的模塊使用了很多l(xiāng)ambda,會(huì)給其他人理解帶來(lái)很多麻煩

適合lambda的場(chǎng)景

話又說(shuō)回來(lái),存在即合理,那么真正需要我們使用lambda的是哪些場(chǎng)景呢:

你需要的方法是很簡(jiǎn)單的(+1,字符串拼接等),該函數(shù)不值得擁有一個(gè)名字

使用lambda表達(dá)式,會(huì)比我們能想到的函數(shù)名稱更容易理解

除了lambda,沒(méi)有任何python提供的函數(shù)可以實(shí)現(xiàn)目的

團(tuán)隊(duì)中所有成員都掌握l(shuí)ambda,大家同意你用

還有一種場(chǎng)景非常適用,就是在給其他人制造自己很專業(yè)的錯(cuò)覺時(shí),比如:

哎呀,小老弟,聽說(shuō)你學(xué)了Python,知道lambda不? 沒(méi)聽過(guò)?不行啊,白學(xué)了!來(lái)來(lái)來(lái),讓我給你講講。。。此處省略1萬(wàn)字
總結(jié)

今天為大家九淺一深地講解了lambda的用法和使用場(chǎng)景,所謂九淺一深,就是90%情況下用于創(chuàng)建簡(jiǎn)單的匿名函數(shù),10%的情況稍微復(fù)雜(我這個(gè)借口找的太好了)

總而言之就是,任何事情都具有兩面性,我們?cè)谑褂胠ambda之前應(yīng)該先停下來(lái),問(wèn)問(wèn)自己是不是真的需要它。

當(dāng)然,如果需要和別人忽悠的時(shí)候都是正反一張嘴,lambda是好是壞全看我們自己怎么說(shuō),吹牛時(shí)請(qǐng)遵守如下原則,屢試不爽:

如果你說(shuō)一個(gè)女大學(xué)生晚上賣淫就是可恥,但如果改成一個(gè)妓女利用業(yè)余時(shí)間努力學(xué)習(xí)就勵(lì)志多了

lambda也是如此

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/43171.html

相關(guān)文章

  • Python 進(jìn)階之路 (十一) 再立Flag, 社區(qū)最全的itertools深度解析(下)

    摘要:將每一行作為返回,其中是每行中的列名。對(duì)于每一行,都會(huì)生成一個(gè)對(duì)象,其中包含和列中的值。它返回一個(gè)迭代器,是迭代結(jié)果都為的情況。深度解析至此全劇終。 簡(jiǎn)單實(shí)戰(zhàn) 大家好,我又來(lái)了,在經(jīng)過(guò)之前兩篇文章的介紹后相信大家對(duì)itertools的一些常見的好用的方法有了一個(gè)大致的了解,我自己在學(xué)完之后仿照別人的例子進(jìn)行了真實(shí)場(chǎng)景下的模擬練習(xí),今天和大家一起分享,有很多部分還可以優(yōu)化,希望有更好主意...

    tomorrowwu 評(píng)論0 收藏0
  • ES6 九淺一深 之一

    摘要:新的標(biāo)準(zhǔn)上周,語(yǔ)言規(guī)范的最終草案,第版,被提交給大會(huì)進(jìn)行審查。從那時(shí)起,標(biāo)準(zhǔn)委員會(huì)就一直致力于的制定直至今日。是語(yǔ)言的一次重大的升級(jí)。這種說(shuō)法也可以被看作是委員會(huì)給出的一個(gè)承諾。 簡(jiǎn)介 歡迎來(lái)到深度探索 ES6!在這個(gè)新的周系列里,我們將探索 ECMAScript 6。這是一種 JavaScript 語(yǔ)言即將到來(lái)的新版本。ES6 包含了很多新的語(yǔ)言功能,且這些語(yǔ)言功能使得 JS 更加強(qiáng)...

    lewif 評(píng)論0 收藏0
  • node.js中文資料導(dǎo)航

    摘要:中文資料導(dǎo)航官網(wǎng)七牛鏡像深入淺出系列進(jìn)階必讀中文文檔被誤解的編寫實(shí)戰(zhàn)系列熱門模塊排行榜,方便找出你想要的模塊多線程,真正的非阻塞淺析的類利用編寫異步多線程的實(shí)例中與的區(qū)別管道拒絕服務(wù)漏洞高級(jí)編程業(yè)界新聞看如何評(píng)價(jià)他們的首次嘗鮮程序員如何說(shuō)服 node.js中文資料導(dǎo)航 Node.js HomePage Node官網(wǎng)七牛鏡像 Infoq深入淺出Node.js系列(進(jìn)階必讀) Nod...

    geekidentity 評(píng)論0 收藏0
  • 記一次XX前端面試

    摘要:面試官說(shuō)那我問(wèn)你一個(gè)哲學(xué)的問(wèn)題,為什么有數(shù)據(jù)結(jié)構(gòu)這種東西哇,這是啥,巴拉巴拉扯了一通,大致就是物以類聚,人以群分,先人積累下來(lái)的經(jīng)驗(yàn),這些讓我們更方便處理數(shù)據(jù)啥的。 前因,沒(méi)有比摸魚有趣的事了 距離自己被外派(俗稱外包)出去,已經(jīng)過(guò)了快五個(gè)月,工作的話,很閑。人啊,一定保持好的習(xí)慣,懶惰是會(huì)上癮,日常摸魚,懷疑人生,我是誰(shuí),我在哪,我要干什么。 中午吃飯的時(shí)候,收到了boss直聘的一條...

    Shisui 評(píng)論0 收藏0
  • Python 進(jìn)階之路 (二) Dict 進(jìn)階寶典,初二快樂(lè)!

    摘要:新年快樂(lè)大家好,今天是大年初二,身在國(guó)外沒(méi)有過(guò)年的氛圍,只能踏實(shí)寫寫文章,對(duì)社區(qū)做點(diǎn)貢獻(xiàn),在此祝大家新年快樂(lè)上一期為大家梳理了一些的進(jìn)階用法,今天我們來(lái)看字典的相關(guān)技巧,我個(gè)人在編程中對(duì)字典的使用非常頻繁,其實(shí)對(duì)于不是非常大的數(shù)據(jù)存儲(chǔ)需求, 新年快樂(lè) 大家好,今天是大年初二,身在國(guó)外沒(méi)有過(guò)年的氛圍,只能踏實(shí)寫寫文章,對(duì)社區(qū)做點(diǎn)貢獻(xiàn),在此祝大家新年快樂(lè)!上一期為大家梳理了一些List的進(jìn)...

    ChristmasBoy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<