1. 程式人生 > >Python中的lambda和apply用法

Python中的lambda和apply用法

目錄

2.1 舉例

3 參考文獻

1 lambda

lambda原型為:lambda 引數:操作(引數)

lambda函式也叫匿名函式,即沒有具體名稱的函式,它允許快速定義單行函式,可以用在任何需要函式的地方。這區別於def定義的函式。

lambda與def的區別:

1)def建立的方法是有名稱的,而lambda沒有。

2)lambda會返回一個函式物件,但這個物件不會賦給一個識別符號,而def則會把函式物件賦值給一個變數(函式名)。

3)lambda只是一個表示式,而def則是一個語句。

4)lambda表示式” : “後面,只能有一個表示式,def則可以有多個。

5)像if或for或print等語句不能用於lambda中,def可以。

6)lambda一般用來定義簡單的函式,而def可以定義複雜的函式。

1.1 舉最簡單的例子

#單個引數的:
g = lambda x : x ** 2
print g(3)
"""
9
"""
#多個引數的:
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)])

因為後者多定義了一個(汙染環境的)函式,尤其如果這個函式只會使用一次的話。

進一步講,匿名函式本質上就是一個函式,它所抽象出來的東西是一組運算。這是什麼意思呢?類比

a = [1, 2, 3]

f = lambda x : x + 1

我們會發現,等號右邊的東西完全可以脫離等號左邊的東西而存在,等號左邊的名字只是右邊之實體的識別符號。如果能習慣 [1, 2, 3] 單獨存在,那麼 lambda x : x + 1 也能單獨存在其實也就不難理解了,它的意義就是給「某個數加一」這一運算本身。

現在回頭來看 map() 函式,它可以將一個函式對映到一個可列舉型別上面。沿用上面給出的 a 和 f,可以寫

map(f, a)

也就是將函式 f 依次套用在 a 的每一個元素上面,獲得結果 [2, 3, 4]。現在用 lambda 表示式來替換 f,就變成:

map( lambda x : x + 1, [1, 2, 3] )

會不會覺得現在很一目瞭然了?尤其是類比

a = [1, 2, 3]
r = []
for each in a:
    r.append(each+1)

2 Apply

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函式的返回值。

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'})  

輸出結果:

('good', 'better')
(2, 9)
('cai', 'quan')
('cai', 'caiquan')
('caiquan', 'Tom')

有時候,函式的引數可能是DataFrame中的行或者列。

2.2 下面的例子是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
"""

3 參考文獻