Python中的lambda和apply用法及說明
1 lambda
lambda原型為:lambda 參數(shù):操作(參數(shù))
lambda函數(shù)也叫匿名函數(shù),即沒有具體名稱的函數(shù),它允許快速定義單行函數(shù),可以用在任何需要函數(shù)的地方。這區(qū)別于def定義的函數(shù)。
lambda與def的區(qū)別:
1)def創(chuàng)建的方法是有名稱的,而lambda沒有。
2)lambda會返回一個函數(shù)對象,但這個對象不會賦給一個標(biāo)識符,而def則會把函數(shù)對象賦值給一個變量(函數(shù)名)。
3)lambda只是一個表達(dá)式,而def則是一個語句。
4)lambda表達(dá)式” : “后面,只能有一個表達(dá)式,def則可以有多個。
5)像if或for或print等語句不能用于lambda中,def可以。
6)lambda一般用來定義簡單的函數(shù),而def可以定義復(fù)雜的函數(shù)。
1.1 舉最簡單的例子
#單個參數(shù)的: g = lambda x : x ** 2 print g(3) """ 9 """ #多個參數(shù)的: g = lambda x, y, z : (x + y) ** z print g(1,2,2) """ 9 """
1.2 再舉一個普通的例子
將一個 list 里的每個元素都平方:
map( lambda x: x*x, [y for y in range(10)] )
這個寫法要好過
def sq(x): ? ? return x * x ? map(sq, [y for y in range(10)])
因為后者多定義了一個(污染環(huán)境的)函數(shù),尤其如果這個函數(shù)只會使用一次的話。
進(jìn)一步講,匿名函數(shù)本質(zhì)上就是一個函數(shù),它所抽象出來的東西是一組運(yùn)算。這是什么意思呢?類比
a = [1, 2, 3]
和
f = lambda x : x + 1
我們會發(fā)現(xiàn),等號右邊的東西完全可以脫離等號左邊的東西而存在,等號左邊的名字只是右邊之實體的標(biāo)識符。如果能習(xí)慣 [1, 2, 3] 單獨存在,那么 lambda x : x + 1 也能單獨存在其實也就不難理解了,它的意義就是給「某個數(shù)加一」這一運(yùn)算本身。
現(xiàn)在回頭來看 map() 函數(shù),它可以將一個函數(shù)映射到一個可枚舉類型上面。沿用上面給出的 a 和 f,可以寫
map(f, a)
也就是將函數(shù) f 依次套用在 a 的每一個元素上面,獲得結(jié)果 [2, 3, 4]?,F(xiàn)在用 lambda 表達(dá)式來替換 f,就變成:
map( lambda x : x + 1, [1, 2, 3] )
會不會覺得現(xiàn)在很一目了然了?尤其是類比
a = [1, 2, 3] r = [] for each in a: ? ? r.append(each+1)
2 Apply
Python中apply函數(shù)的格式為:apply(func,*args,**kwargs)
當(dāng)然,func可以是匿名函數(shù)。
用途:當(dāng)一個函數(shù)的參數(shù)存在于一個元組或者一個字典中時,用來間接的調(diào)用這個函數(shù),并將元組或者字典中的參數(shù)按照順序傳遞給參數(shù)
解析:args是一個包含按照函數(shù)所需參數(shù)傳遞的位置參數(shù)的一個元組,簡單來說,假如A函數(shù)的函數(shù)位置為 A(a=1,b=2),那么這個元組中就必須嚴(yán)格按照這個參數(shù)的位置順序進(jìn)行傳遞(a=3,b=4),而不能是(b=4,a=3)這樣的順序。kwargs是一個包含關(guān)鍵字參數(shù)的字典,而其中args如果不傳遞,kwargs需要傳遞,則必須在args的位置留空。
apply的返回值就是函數(shù)func函數(shù)的返回值。
2.1 舉例
? ?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'}) ?
輸出結(jié)果:
('good', 'better')
(2, 9)
('cai', 'quan')
('cai', 'caiquan')
('caiquan', 'Tom')
有時候,函數(shù)的參數(shù)可能是DataFrame中的行或者列。
2.2 下面的例子是DataFrame中apply的用法
#函數(shù)應(yīng)用和映射 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 """ ? #將函數(shù)應(yīng)用到由各列或行形成的一維數(shù)組上。DataFrame的apply方法可以實現(xiàn)此功能 f=lambda x:x.max()-x.min() #默認(rèn)情況下會以列為單位,分別對列應(yīng)用函數(shù) 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 """ ? #除標(biāo)量外,傳遞給apply的函數(shù)還可以返回由多個值組成的Series def f(x): ? ? return pd.Series([x.min(),x.max()],index=['min','max']) t3=df.apply(f) #從運(yùn)行的結(jié)果可以看出,按列調(diào)用的順序,調(diào)用函數(shù)運(yùn)行的結(jié)果在右邊依次追加 print(t3) ? """ ? ? ? ? ? ? b ? ? ? ? d ? ? ? ? e min -0.896774 -2.238288 -0.662676 max ?0.701109 ?1.974801 ?0.738890 """ ? #元素級的python函數(shù),將函數(shù)應(yīng)用到每一個元素 #將DataFrame中的各個浮點值保留兩位小數(shù) 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有一個元素級函數(shù)的map方法。而dataframe只有applymap。 t4=df['e'].map(f) print(t4) ? """ utah ? ? 0.74 ohio ? ? 0.47 texas ? -0.66 oregon ?-0.15 """
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
opencv+pyQt5實現(xiàn)圖片閾值編輯器/尋色塊閾值利器
這篇文章主要介紹了opencv+pyQt5實現(xiàn)圖片閾值編輯器/尋色塊閾值利器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11有關(guān)Tensorflow梯度下降常用的優(yōu)化方法分享
今天小編就為大家分享一篇有關(guān)Tensorflow梯度下降常用的優(yōu)化方法分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02淺談PyQt5中異步刷新UI和Python多線程總結(jié)
今天小編就為大家分享一篇淺談PyQt5中異步刷新UI和Python多線程總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12