淺談python之高階函數(shù)和匿名函數(shù)
map()
map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是Iterable,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回。
def func(x): return x*x r = map(func, [1, 2, 3, 4, 5]) print(type(r)) r = list(r) print(r)
輸出結(jié)果:
<class 'map'>
[1, 4, 9, 16, 25]
可以看出,map讓函數(shù)func作用于列表的每一項(xiàng),使列表的每一項(xiàng)都被函數(shù)func執(zhí)行一次,即列表的每一項(xiàng)都進(jìn)行平方。其返回值是map類型。
reduce()
reduce函數(shù)必須接收兩個(gè)參數(shù),把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ...]上,然后再把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算。
from functools import reduce def fn(x, y): return x * 10 + y f = reduce(fn, [1, 3, 5, 7, 9]) # 把序列變?yōu)檎麛?shù) print(f) print(type(f))
輸出結(jié)果:
13579
<class 'int'>
和map不同,雖然reduce也是作用于每個(gè)元素,但是reduce的作用結(jié)果要用在下次和另一個(gè)元素做累積計(jì)算。
map()和reduce()的結(jié)合使用
from functools import reduce def fn(x, y): return x * 10 + y def char2num(s): digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} return digits[s] f = reduce(fn, map(char2num, '13579')) print(f)
輸出結(jié)果:
13579
可以將字符串類型轉(zhuǎn)換為int類型
filter()
filter()函數(shù)用于過濾序列,接收一個(gè)函數(shù)和一個(gè)序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
def not_empty(s): return s and s.strip() # 不能直接寫s.strip() f = filter(not_empty, ['A', '', 'B', None, 'C', ' ']) print(type(f)) print(list(f))
輸出結(jié)果:
<class 'filter'>
['A', 'B', 'C']
sorted()
sorted()函數(shù)也是一個(gè)高階函數(shù),在列表的學(xué)習(xí)中初步接觸了sorted(),但其實(shí)它還可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序。
key指定的函數(shù)將作用于被排序?qū)ο蟮拿恳粋€(gè)元素上,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序。
l = sorted([36, 5, -12, 9, -21], key=abs) # 按絕對值大小排序 print(l) s = sorted(['bob', 'about', 'Zoo', 'Credit']) # 按ASCII大小排序 print(s) sl = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) # 忽略大小寫排序 print(sl) sr = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) # 反向排序 print(sr)
輸出結(jié)果:
[5, 9, -12, -21, 36]
['Credit', 'Zoo', 'about', 'bob']
['about', 'bob', 'Credit', 'Zoo']
['Zoo', 'Credit', 'bob', 'about']
同樣的,sorted()也可以對元組和字典進(jìn)行排序
from operator import itemgetter # 需要使用operator模塊 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] print(sorted(L, key=itemgetter(0)))
輸出結(jié)果:
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
當(dāng)然,也能以values的值來排序,對字典的排序與元組類似,但返回值不同。
from operator import itemgetter dic = {"Bob": 75, "Adam": 92, "Lisa": 88} print(sorted(dic,key=itemgetter(0))) print(sorted(dic, key=itemgetter(1)))
輸出結(jié)果:
['Adam', 'Bob', 'Lisa']
['Adam', 'Lisa', 'Bob']
可以看到,不管是以key值進(jìn)行排序,還是以value值進(jìn)行排序,排序結(jié)果只返回對應(yīng)順序的key值。
匿名函數(shù)
f = list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) print(f)
輸出結(jié)果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
上面就是一個(gè)匿名函數(shù)的使用,匿名函數(shù) lambda x: x * x 實(shí)際上就是:
def f(x): return x * x
只是在這里沒有顯式地定義函數(shù),這樣因?yàn)楹瘮?shù)沒有名字,不必?fù)?dān)心函數(shù)名沖突,而且代碼看起來也簡潔。
以上所述是小編給大家介紹的python之高階函數(shù)和匿名函數(shù)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Python中Matplotlib圖像添加標(biāo)簽的方法實(shí)現(xiàn)
本文主要介紹了Python中Matplotlib圖像添加標(biāo)簽的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04- 在實(shí)驗(yàn)中需要自己構(gòu)造單獨(dú)的HTTP數(shù)據(jù)報(bào)文,而使用SOCK_STREAM進(jìn)行發(fā)送數(shù)據(jù)包,需要進(jìn)行完整的TCP交互。因此想使用原始套接字進(jìn)行編程,直接構(gòu)造數(shù)據(jù)包,并在IP層進(jìn)行發(fā)送,即采用SOCK_RAW進(jìn)行數(shù)據(jù)發(fā)送。使用SOCK_RAW的優(yōu)勢是,可以對數(shù)據(jù)包進(jìn)行完整的修改,可以處理IP層上的所有數(shù)據(jù)包,對各字段進(jìn)行修改,而不受UDP和TCP的限制。2014-02-02
Python實(shí)戰(zhàn)實(shí)現(xiàn)爬取天氣數(shù)據(jù)并完成可視化分析詳解
這篇文章主要和大家分享一個(gè)用Python實(shí)現(xiàn)的小功能:獲取天氣數(shù)據(jù),進(jìn)行可視化分析,帶你直觀了解天氣情況!感興趣的小伙伴可以學(xué)習(xí)一下2022-06-06卷積神經(jīng)網(wǎng)絡(luò)(CNN)基于SqueezeNet的眼疾識別功能
SqueezeNet是一種輕量且高效的CNN模型,它參數(shù)比AlexNet少50倍,但模型性能(accuracy)與AlexNet接近,這篇文章主要介紹了卷積神經(jīng)網(wǎng)絡(luò)(CNN)基于SqueezeNet的眼疾識別,需要的朋友可以參考下2023-08-08創(chuàng)建Python Docker鏡像的詳細(xì)步驟
Python和Docker是兩個(gè)極其流行的技術(shù),結(jié)合它們可以創(chuàng)建強(qiáng)大的應(yīng)用程序,Docker允許將應(yīng)用程序及其依賴項(xiàng)打包到一個(gè)獨(dú)立的容器中,而Python則提供了豐富的庫和工具來開發(fā)應(yīng)用程序,本文將提供如何創(chuàng)建Python Docker鏡像的全面指南,,需要的朋友可以參考下2023-12-12