<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家好,今天給大家帶來的是有關於Python裡面的lambda表示式詳細解析。lambda在Python裡面的用處很廣,但說實話,我個人認為有關於lambda的討論不是如何使用的問題,而是該不該用的問題。接下來還是通過大量範例和大家分享我的學習體驗,可能最後你也會得出和我一樣的結論。
好啦,首先讓我們先搞明白基礎定義,lambda到底是什麼?
Lambda表達了Python中用於建立匿名函數的特殊語法。我們將lambda語法本身稱為lambda表示式,從這裡得到的函數稱之為lambda函數。
其實總結起來,lambda可以理解為一個小的匿名函數,lambda函數可以使用任意數量的引數,但只能有一個表示式。估計有JavaScript ES6經驗的朋友們聽上去會很親切,具體函數表示式如下:
模板: lambda argument: manipulate(argument)
引數:argument就是這個匿名函數傳入的引數,冒號後面是我們對這個引數的操作方法
讓我們參考上面的定義模板和引數, 直接看一個最簡單的例子:
add_one = lambda x:x+1 # 1個引數,執行操作為+1 add_nums = lambda x,y:x+y # 2個引數,執行操作為相加 print(add_one(2)) # 呼叫add_one print(add_nums(3,7)) # 呼叫add_nums >>> 3 10
相比大家已經發現lambda匿名函數的特點了,就是對於較為簡單的功能,無需自己def一個了,單行就可以寫下,傳參和執行方法一氣呵成
接下來讓我們看看lambda的實際應用,就我自己使用lambda的體驗來說,從來沒有單獨用過,lambda一般情況下是和map,filter,reduce這些超棒的內建函數以及dict,list,tuple,set 等資料結構混用,這樣才能發揮它的最大效果.
好了,閒話少說,下面讓我們一個個來看
首先出場的是lambda+map的組合,先看下面這個例子:
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)
這個是我們上一期的例子,實現一個陣列(元組)每個元素+1,讓我們回憶一下map的用法map(fun,sequence)
,fun是傳遞的方法,sequence是一個可迭代的序列,這裡我們的fun就是匿名函數lambda n:n+1
,這裡非常完美的解釋了lambda的設計初衷,因為如果沒有lambda,我們的解決方案是這樣:
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方法有點多餘,所以用lambda代替是個好的選擇。讓我們再看下一個例子,這是我自己備份紀錄檔時寫的一小段程式碼,命名不是很規範:
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 實現字串拼接 print(result) Out:['serverLog_11-02-19.py', 'appLog_11-02-19.py', 'paymentLog_11-02-19.py']
這裡和剛才的加1例子差不多,但是換成了字串的拼接,然而我這裡用lambda並不是很好的解決方案,最後我們會說,現在大家應該對map + lambda 有一些感覺了,讓我們再來個和dict字典互動的例子:
person =[{'name':'Lilei', 'city':'beijing'}, {'name':'HanMeiMei', 'city':'shanghai'}] names=list(map(lambda x:x['name'],person)) print(names) Out:['Lilei', 'HanMeiMei']
好了,看到這裡對於map+lambda的用法大家已經很清楚了應該~
lambda和filter的組合也很常見,用於特定篩選條件下,現在讓我們來看上篇文章filter的例子,就應該很好理解了:
numbers = [0, 1, 2, -3, 5, -8, 13] # 提取奇數 result = filter(lambda x: x % 2, numbers) print("Odd Numbers are :",list(result)) # 提取偶數 result = filter(lambda x: x % 2 == 0, numbers) print("Even Numbers are :",list(result)) #提取正數 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]
這裡無非就是我們把filter(fun,sequence)裡面的fun換成了我們的lambda,只是lambda的函數部分(x%2,x%2==0,x>0)都是可以返回True或者False來判斷的,符合fiter的要求,用剛才李雷和韓梅梅的例子也是一個道理:
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'}]
還是讓我們看一下上篇文章的例子:
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
這個例子用lambda和reduce的配合實現了list求累積和和累積乘法。
有意思的是這個例子具有兩面性,一方面展示了lambda和reduce如何一起使用,另一方面也引出了接下來我想說的重點:lambda真的值得用嗎?到底應該怎麼用?
通過上面的例子大家已經看到了lambda的實際應用場景,但是這裡我想和大家分享一下我的看法:我認為lambda的缺點略多於優點,應該避免過度使用lambda.
首先,這僅僅是我的個人看法哈,希望大家理解,我為什麼這麼說呢,首先讓我們拿lambda方法和常規def做個對比,我發現lambda和def的主要不同點如下:
有關優點大家都可以看到,我主要想說一下它的缺點,首先,從真正需求出發,我們在大多數時候是不需要lambda的,因為總可以找到更好的替代方法,現在我們一起看一下剛才lambda+reduce 的例子,我們用lambada實現的結果如下:
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並沒有實現簡單高效的目的,因為我們有現成的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
結果是一樣的,但是顯然用sum和mul的方案更加高效。再舉個常見的例子說明,假如我們有一個list儲存了各種顏色,現在要求把每個顏色首字母大寫,如果用lambda寫出是這樣:
colors = ['red','purple','green','blue'] result = map(lambda c:c.capitalize(),colors) print(list(result)) Out:['Red', 'Purple', 'Green', 'Blue'] 看著似乎不錯,挺簡潔的,但是我們有更好的方法: colors = ['red','purple','green','blue'] result = [c.capitalize() for c in colors] print(result) Out:['Red', 'Purple', 'Green', 'Blue'] 用sorted還能處理首字母不規範的情況,連排序都省了: colors = ['Red','purple','Green','blue'] print(sorted(colors,key=str.capitalize)) Out:['blue', 'Green', 'purple', 'Red']
還有一個主要原因就是: lambda函數沒有函數名稱。所以在程式碼交接,專案移植的場景中會給團隊帶來很多困難,多寫個函數add_one()沒什麼壞處,因為大家都很容易理解,知道它是執行+1的功能,但是如果團隊裡你在自己負責的模組使用了很多lambda,會給其他人理解帶來很多麻煩
話又說回來,存在即合理,那麼真正需要我們使用lambda的是哪些場景呢:
還有一種場景非常適用,就是在給其他人制造自己很專業的錯覺時,比如:
哎呀,小老弟,聽說你學了Python,知道lambda不? 沒聽過?不行啊,白學了!
來來來,讓我給你講講。。。此處省略1萬字
今天為大家九淺一深地講解了lambda的用法和使用場景,所謂九淺一深,就是90%情況下用於建立簡單的匿名函數,10%的情況稍微複雜(我這個藉口找的太好了)
總而言之就是,任何事情都具有兩面性,我們在使用lambda之前應該先停下來,問問自己是不是真的需要它。
當然,如果需要和別人忽悠的時候都是正反一張嘴,lambda是好是壞全看我們自己怎麼說,吹牛時請遵守如下原則,屢試不爽:
如果你說一個女大學生晚上賣淫就是可恥,但如果改成一個妓女利用業餘時間努力學習就勵志多了!
lambda也是如此
Python中apply函數的格式為:apply(func,*args,**kwargs)
當然,func可以是匿名函數。
用途:當一個函數的引數存在於一個元組或者一個字典中時,用來間接的呼叫這個函數,並將元組或者字典中的引數按照順序傳遞給引數
解析:args
是一個包含按照函數所需引數傳遞的位置引數的一個元組,簡單來說,假如A函數的函數位置為 A(a=1,b=2),那麼這個元組中就必須嚴格按照這個引數的位置順序進行傳遞(a=3,b=4),而不能是(b=4,a=3)這樣的順序。kwargs
是一個包含關鍵字引數的字典,而其中args如果不傳遞,kwargs需要傳遞,則必須在args的位置留空。
apply的返回值就是函數func函數的返回值。
⭐舉例
def function(a,b): print(a,b) apply(function,('good','better')) apply(function,(2,3+6)) apply(function,('cai','quan')) apply(function,('cai',),{'b':'caiquan'}) apply(function,(),{'a':'caiquan','b':'Tom'})
輸出結果:
('good', 'better')
(2, 9)
('cai', 'quan')
('cai', 'caiquan')
('caiquan', 'Tom')
對資料進行預處理時,大家使用比較多的是apply函數,apply函數是pandas庫中的函數,非常好用的一個函數相當於迴圈遍歷,起到對每一條資料進行處理的效果,函數的引數可能是DataFrame中的行或者列。
說到apply又不得不說lambda函數了,這兩個結合來用簡直爽的不行。
lambda關鍵字可以用來建立一個小的匿名函數
範例:
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), *kwds)
第一個引數func是一個函數,需要自己實現,可以使用lambda匿名函數,axis預設值為0,axis為0時,會把一列的資料進行遍歷。
data[‘cut_review'].apply(lambda x: [i for i in x s if i not in stopwords])
⭐下面的例子是DataFrame中apply的用法
#函數應用和對映 import numpy as np import pandas as pd df=pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon']) print(df) """ b d e utah -0.667969 1.974801 0.738890 ohio -0.896774 -0.790914 0.474183 texas 0.043476 0.890176 -0.662676 oregon 0.701109 -2.238288 -0.154442 """ #將函數應用到由各列或行形成的一維陣列上。DataFrame的apply方法可以實現此功能 f=lambda x:x.max()-x.min() #預設情況下會以列為單位,分別對列應用函數 t1=df.apply(f) print(t1) t2=df.apply(f,axis=1) print(t2) """ b 1.597883 d 4.213089 e 1.401566 dtype: float64 utah 2.642770 ohio 1.370957 texas 1.552852 oregon 2.939397 dtype: float64 """ #除標量外,傳遞給apply的函數還可以返回由多個值組成的Series def f(x): return pd.Series([x.min(),x.max()],index=['min','max']) t3=df.apply(f) #從執行的結果可以看出,按列呼叫的順序,呼叫函數執行的結果在右邊依次追加 print(t3) """ b d e min -0.896774 -2.238288 -0.662676 max 0.701109 1.974801 0.738890 """ #元素級的python函數,將函數應用到每一個元素 #將DataFrame中的各個浮點值保留兩位小數 f=lambda x: '%.2f'%x t3=df.applymap(f) print(t3) """ b d e utah -0.67 1.97 0.74 ohio -0.90 -0.79 0.47 texas 0.04 0.89 -0.66 oregon 0.70 -2.24 -0.15 """ #注意,之所以這裡用map,是因為Series有一個元素級函數的map方法。而dataframe只有applymap。 t4=df['e'].map(f) print(t4) """ utah 0.74 ohio 0.47 texas -0.66 oregon -0.15 """
到此這篇關於python3中apply函數和lambda函數的使用詳解的文章就介紹到這了,更多相關python3 apply函數和lambda函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45