Python學(xué)習(xí)之魔法函數(shù)(filter,map,reduce)詳解
今天的這一章節(jié)我們來(lái)學(xué)習(xí)一下,Python 中的三個(gè)高級(jí)函數(shù),也被稱(chēng)之為 魔法函數(shù)。之所以把他們交的這么高級(jí),主要是因?yàn)樗鼈兎祷氐臄?shù)據(jù)類(lèi)型多數(shù)是 迭代器。
我們?cè)谏弦徽鹿?jié)有介紹過(guò),迭代器 可以提升我們的代碼的執(zhí)行效率、降低內(nèi)存消耗。所以接下來(lái)我們就認(rèn)識(shí)一下這些 魔法函數(shù)。
filter() 函數(shù)
filter() 函數(shù) 是python的一個(gè)內(nèi)置函數(shù)。
filter() 函數(shù)的功能:可以將一個(gè)可遍歷的對(duì)象根據(jù)過(guò)濾條件,生成一個(gè)迭代器。(在python2.7版本,返回的是列表)
filter() 函數(shù)的使用方法:
用法:
filter(function, list)
參數(shù)介紹:
function:對(duì)list的每個(gè)item進(jìn)行條件過(guò)濾的定義(主要對(duì)第二參數(shù)的每個(gè)成員進(jìn)行判斷,滿足函數(shù)的要求,將會(huì)進(jìn)入 filter 生成的迭代器)
list:需要過(guò)濾的列表 (其實(shí)這里不一定只可以放列表,放入的是可迭代對(duì)象)
演示案例如下(過(guò)濾出列表中的所有偶數(shù)):
def is_even(n): return n % 2 == 0 newlist = filter(is_even, [1, 2, 3, 4, 5, 6]) print(newlist, type(newlist)) # >>> 執(zhí)行結(jié)果如下: # >>> <filter object at 0x7fb241492310> <class 'filter'> for i in newlist: print(i) # >>> 執(zhí)行結(jié)果如下: # >>> 2 # >>> 4 # >>> 6
PS:需要注意的是,這里的非偶數(shù),雖然會(huì)被過(guò)濾函數(shù)拋棄,但是依然會(huì)存在于之前的列表中。
map() 函數(shù)
map() 函數(shù) 是python的一個(gè)內(nèi)置函數(shù)。
map() 函數(shù)的功能:對(duì)列表中的每一個(gè)成員依次執(zhí)行函數(shù)進(jìn)行判斷,將執(zhí)行的結(jié)果放到新 list 中,返回一個(gè) map 對(duì)應(yīng)的對(duì)象。
map() 函數(shù)的使用方法:
用法:
map(function, list)
參數(shù)介紹:
function:對(duì) list 每個(gè) item 進(jìn)行條件滿足的判斷
list:需要過(guò)濾的列表 (其實(shí)這里不一定只可以放列表,放入的是可迭代對(duì)象)
演示案例如下(對(duì)列表中的每一個(gè)成員判斷是否大于1):
result = map(lambda x: x>1, [0, 1, 2, 3]) print(result, type(result)) # >>> 執(zhí)行結(jié)果如下: # >>> <map object at 0x7facfa399e80> <class 'map'> for i in result: print(i) # >>> 執(zhí)行結(jié)果如下: # >>> False # >>> False # >>> True # >>> True
reduce() 函數(shù)
reduce() 函數(shù) 以前是python的一個(gè)內(nèi)置函數(shù),現(xiàn)在不是了。(在python 2.x版本的時(shí)候,reduce() 函數(shù)可以直接被調(diào)用;但是在 python 3.x 的版本中,由于返回的不是一個(gè)迭代器,所以需要先執(zhí)行導(dǎo)入然后才可以繼續(xù)使用。導(dǎo)入語(yǔ)句 from functools import reduce)
reduce() 函數(shù) 的功能:對(duì)循環(huán)前后的兩個(gè)數(shù)據(jù)進(jìn)行累加或者累乘。(實(shí)際上可以通過(guò) lambda 對(duì)這兩個(gè)成員進(jìn)行任何的處理)
reduce() 函數(shù)的使用方法:
用法:
reduce(function, list)
參數(shù)介紹:
function:對(duì)數(shù)據(jù)累加/累成的函數(shù)
list:需要過(guò)濾的列表 (其實(shí)這里不一定只可以放列表,放入的是可迭代對(duì)象)
演示案例如下(對(duì)循環(huán)前后的兩個(gè)數(shù)據(jù)進(jìn)行累加或者累乘):
from functools import reduce result = reduce(lambda x, y: x + y, [1, 2, 3]) print(result, '---', type(result)) # >>> 執(zhí)行結(jié)果如下: # >>> 6 --- <class 'int'> from functools import reduce result = reduce(lambda x, y: x * y, [1, 3, 5]) print(result, '---', type(result)) # >>> 執(zhí)行結(jié)果如下: # >>> 15 --- <class 'int'>
filter() 函數(shù) 小實(shí)戰(zhàn)
scores = [("張三", 89, 90, 59), ("李四", 99, 49, 59), ("趙五", 99, 60, 20), ("王二麻子", 40, 94, 59), ("李雷", 89, 90, 59), ("李莉", 89, 90, 69), ("楚浠", 79, 90, 59), ("Neo", 85, 90, 59), ("Abby", 89, 91, 90)] def handle_filter(a): s = sorted(a[1:]) # 對(duì)三科成績(jī)進(jìn)行排序 # 有 2 科成績(jī)?cè)?80 分以上,并且有 1 科在 60 分以下的 if s[-2] > 80 and s[0] < 60: return True # 有 1 科成績(jī)?cè)?90 分以上,另外 2 科成績(jī)都在 60 分以下 if s[-1] > 90 and s[1] < 60: return True if s[-2] > 80 and sum(s)/len(s) < 60: # 有 1 科成績(jī)?cè)?90 分以上, 且 3 科的平均分在 70 分以下 return True return False newIter = list(filter(handle_filter, scores)) print(newIter) # >>> 執(zhí)行結(jié)果如下: # >>> [('張三', 89, 90, 59), ('李四', 99, 49, 59), ('王二麻子', 40, 94, 59), ('李雷', 89, 90, 59), ('Neo', 85, 90, 59)]
到此這篇關(guān)于Python學(xué)習(xí)之魔法函數(shù)(filter,map,reduce)詳解的文章就介紹到這了,更多相關(guān)Python filter() map() reduce()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用xauth方式登錄飯否網(wǎng)然后發(fā)消息
這篇文章主要介紹了python使用xauth方式登錄飯否網(wǎng)然后發(fā)消息示例,需要的朋友可以參考下2014-04-04解決Python plt.savefig 保存圖片時(shí)一片空白的問(wèn)題
今天小編就為大家分享一篇解決Python plt.savefig 保存圖片時(shí)一片空白的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python使用socket高效傳輸視頻數(shù)據(jù)幀(連續(xù)發(fā)送圖片)
本文主要介紹了python使用socket高效傳輸視頻數(shù)據(jù)幀(連續(xù)發(fā)送圖片),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10python之pexpect實(shí)現(xiàn)自動(dòng)交互的例子
今天小編就為大家分享一篇python之pexpect實(shí)現(xiàn)自動(dòng)交互的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python transpose()處理高維度數(shù)組的軸變換的實(shí)現(xiàn)
本文主要介紹了python transpose()處理高維度數(shù)組的軸變換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09linux系統(tǒng)下pip升級(jí)報(bào)錯(cuò)的解決方法
這篇文章主要給大家介紹了關(guān)于linux系統(tǒng)下pip升級(jí)報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01python入門(mén)基礎(chǔ)之用戶(hù)輸入與模塊初認(rèn)識(shí)
Python的強(qiáng)大之處在于他有非常豐富和強(qiáng)大的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù),幾乎你想實(shí)現(xiàn)的任何功能都有相應(yīng)的Python庫(kù)支持。下面通過(guò)本文給大家介紹python入門(mén)基礎(chǔ)之用戶(hù)輸入與模塊初認(rèn)識(shí),一起看看吧2016-11-11