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會(huì)返回一個(gè)函數(shù)對(duì)象,但這個(gè)對(duì)象不會(huì)賦給一個(gè)標(biāo)識(shí)符,而def則會(huì)把函數(shù)對(duì)象賦值給一個(gè)變量(函數(shù)名)。
3)lambda只是一個(gè)表達(dá)式,而def則是一個(gè)語句。
4)lambda表達(dá)式” : “后面,只能有一個(gè)表達(dá)式,def則可以有多個(gè)。
5)像if或for或print等語句不能用于lambda中,def可以。
6)lambda一般用來定義簡單的函數(shù),而def可以定義復(fù)雜的函數(shù)。
1.1?舉最簡單的例子
# 單個(gè)參數(shù)的:
g = lambda x: x ** 2
print(g(3))
"""
9
"""
# 多個(gè)參數(shù)的:
g = lambda x, y, z: (x + y) ** z
print(g(1, 2, 2))
"""
9
"""
1.2 再舉一個(gè)普通的例子
將一個(gè) list 里的每個(gè)元素都平方:
map(lambda x: x * x, [y for y in range(10)])
這個(gè)寫法要好過
def sq(x):
return x * x
map(sq, [y for y in range(10)])
因?yàn)楹笳叨喽x了一個(gè)(污染環(huán)境的)函數(shù),尤其如果這個(gè)函數(shù)只會(huì)使用一次的話。
進(jìn)一步講,匿名函數(shù)本質(zhì)上就是一個(gè)函數(shù),它所抽象出來的東西是一組運(yùn)算。這是什么意思呢?類比
a = [1, 2, 3]
和
f = lambda x : x + 1
我們會(huì)發(fā)現(xiàn),等號(hào)右邊的東西完全可以脫離等號(hào)左邊的東西而存在,等號(hào)左邊的名字只是右邊之實(shí)體的標(biāo)識(shí)符。如果能習(xí)慣 [1, 2, 3] 單獨(dú)存在,那么 lambda x : x + 1 也能單獨(dú)存在其實(shí)也就不難理解了,它的意義就是給「某個(gè)數(shù)加一」這一運(yùn)算本身。
2 map
現(xiàn)在回頭來看 map() 函數(shù),它可以將一個(gè)函數(shù)映射到一個(gè)可枚舉類型上面。沿用上面給出的 a 和 f,可以寫
map(f, a)
也就是將函數(shù) f 依次套用在 a 的每一個(gè)元素上面,獲得結(jié)果 [2, 3, 4]。現(xiàn)在用 lambda 表達(dá)式來替換 f,就變成:
map(lambda x: x + 1, [1, 2, 3])
會(huì)不會(huì)覺得現(xiàn)在很一目了然了?尤其是類比
a = [1, 2, 3]
r = []
for each in a:
r.append(each + 1)
3 Apply
Python中apply函數(shù)的格式為:
apply(func,*args,**kwargs)
當(dāng)然,func可以是匿名函數(shù)。
用途:當(dāng)一個(gè)函數(shù)的參數(shù)存在于一個(gè)元組或者一個(gè)字典中時(shí),用來間接的調(diào)用這個(gè)函數(shù),并將元組或者字典中的參數(shù)按照順序傳遞給參數(shù)
解析:args是一個(gè)包含按照函數(shù)所需參數(shù)傳遞的位置參數(shù)的一個(gè)元組,簡單來說,假如A函數(shù)的函數(shù)位置為 A(a=1,b=2),那么這個(gè)元組中就必須嚴(yán)格按照這個(gè)參數(shù)的位置順序進(jìn)行傳遞(a=3,b=4),而不能是(b=4,a=3)這樣的順序。kwargs是一個(gè)包含關(guān)鍵字參數(shù)的字典,而其中args如果不傳遞,kwargs需要傳遞,則必須在args的位置留空。
apply的返回值就是函數(shù)func函數(shù)的返回值。
3.1 舉例
from past.builtins import apply
def function(a, b):
print(a, b)
apply(function, 'good', 'better')
apply(function, 2, 3 + 6)
apply(function, ('good',), {'b': 'better'})
運(yùn)行結(jié)果:
good better
2 9
('good',) {'b': 'better'}
3.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方法可以實(shí)現(xiàn)此功能
f=lambda x:x.max()-x.min()
#默認(rèn)情況下會(huì)以列為單位,分別對(duì)列應(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ù)還可以返回由多個(gè)值組成的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
"""
#元素級(jí)的python函數(shù),將函數(shù)應(yīng)用到每一個(gè)元素
#將DataFrame中的各個(gè)浮點(diǎn)值保留兩位小數(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,是因?yàn)镾eries有一個(gè)元素級(jí)函數(shù)的map方法。而dataframe只有applymap。
t4=df['e'].map(f)
print(t4)
"""
utah 0.74
ohio 0.47
texas -0.66
oregon -0.15
"""
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
