python中三種高階函數(shù)(map,reduce,filter)詳解
- map(function,seq[,seq2]) 接收至少兩個(gè)參數(shù),基本作用為將傳入的函數(shù)依次作用到序列的每個(gè)元素,并且把結(jié)果作為新的序列 返回一個(gè)可迭代的map對(duì)象
function:函數(shù)對(duì)象
py2中可為None,作用等同于zip()
如:
py3中不可為None,None是不可調(diào)用、不可迭代對(duì)象
seq:可迭代對(duì)象,可以傳一個(gè)或多個(gè)
# 傳一個(gè): def func(i):return i*2 print([i for i in map(func,[1,'2'])]) # [2,'22'] # 傳多個(gè) def func2(x,y):return x+y print([i for i in map(func2,[1,2],[2,3])]) # [3, 5]
結(jié)合圖 map()的作用可以理解為:
# 傳一個(gè)時(shí) seq=[1,'2'] result=[] def func(x):return x*2 for i in seq: result.append(func(i)) print(result) # 傳多個(gè)時(shí) seq1=[1,2] seq2=[2,3] result=[] def func2(x,y):return x+y for x,y in zip(seq1,seq2): result.append(func2(x,y)) print(result)
當(dāng)多個(gè)可迭代對(duì)象的長(zhǎng)度不一致時(shí),map只會(huì)取最短組合;同時(shí)每個(gè)可迭代對(duì)象相應(yīng)位置參數(shù)類(lèi)型需一致!(除了py支持的"str"*n)
如:
seq1=[1,2] seq2=[2,3,4] result=[] def func2(x,y):return x+y for x,y in zip(seq1,seq2): result.append(func2(x,y)) print(result) #[3,5]
map的function參數(shù)可以是lambda對(duì)象
如:
print([i for i in map(lambda x, y, z: (f'x:{x}', f'y:{y}', f'z:{z}'), [1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2])]) # [('x:1', 'y:1', 'z:1'), ('x:2', 'y:2', 'z:2')]
- filter(function, seq)接收兩個(gè)參數(shù),基本作用是對(duì)可迭代對(duì)象中的元素進(jìn)行過(guò)濾;并返回一個(gè)新的可迭代filter對(duì)象
function:函數(shù)對(duì)象,返回值必須是個(gè)boolean值
seq:可迭代對(duì)象
如:獲取所有小寫(xiě)的字符串
print([i for i in filter(lambda k: str(k).islower(), ['Java', 'Python', 'js', 'php'])]) # ['js', 'php']
等同于:
_list=['Java','Python','js','php'] result=[] def is_lower(str_obj):return str(str_obj).islower() for i in _list: if is_lower(i): result.append(i) print(result)
- reduce(function,seq[,initial])接收三個(gè)參數(shù),基本作用為對(duì)序列進(jìn)行累積;并返回結(jié)果。python3中reduce需從functools模塊導(dǎo)入
function:函數(shù)對(duì)象
seq: 可迭代對(duì)象
initial:初始值,選填參數(shù)
工作過(guò)程是:
reduce在迭代seq的過(guò)程中,第一次先把 seq的前兩個(gè)元素傳給 函數(shù)function,函數(shù)處理后,再把得到的結(jié)果和第三個(gè)元素作為兩個(gè)參數(shù)再次傳遞給函數(shù)function, 函數(shù)處理后得到的結(jié)果又和第四個(gè)元素作為兩個(gè)參數(shù)傳給函數(shù)function 依次類(lèi)推,直至seq被迭代完。 如果傳入了 initial 值, 那么首次傳遞的兩個(gè)元素則是 initial值 和 第一個(gè)元素。經(jīng)過(guò)一次次累計(jì)計(jì)算之后得到一個(gè)匯總返回值。
如:求和
def _add(x, y): return x + y # 指定initial print(reduce(_add,[1],3)) # 4 print(reduce(_add, [1, 2], 2)) # 5 # 不指定initial print(reduce(_add, [1, 2])) # 3 print(reduce(_add,[1])) # 1 print(reduce(_add, [1, 2, 3, 4, 5])) # 15
等同于:
def fact(n): if n == 1: return 1 return n + fact(n - 1) print(fact(5)) # 15
借助lambda:
print(reduce(lambda x, y: x + y, range(1, 6))) # 15
結(jié)合實(shí)際:假設(shè)我們要取出字典的key中包含某個(gè)關(guān)鍵字的鍵值對(duì)
如:取出下列字典中key值包含ECU的鍵值對(duì)
key = "ECU" file_dict = {'value': 'name', '刷寫(xiě)ECU': 'burn_ecu_version=ecu_name,burn_package_url,(flash_method)', 'BD升級(jí)ECU': 'bd_ecu_version=ecu_name,doip_package_url', '設(shè)置證書(shū)': 'set_ecu_certs=set_method,ecu_name,(bench_name)', 'x': {"ECU": "xx"}}
方法一:引入其他變量
result = {} for k, v in file_dict.items(): if key in k: result[k] = v print(result) # {'刷寫(xiě)ECU': 'burn_ecu_version=ecu_name,burn_package_url,(flash_method)', 'BD升級(jí)ECU': 'bd_ecu_version=ecu_name,doip_package_url'}
方法二:使用推導(dǎo)式
print(dict((k, v) for k, v in file_dict.items() if key in k))
方法三:reduce+map+filter
from functools import reduce print(reduce(lambda x, y: x.update(y) or x, [i for i in map(lambda k: {k: file_dict[k]}, filter(lambda k: key in k, file_dict))]))
細(xì)心的同學(xué)肯定發(fā)現(xiàn)無(wú)法過(guò)濾出嵌套key。這是弊端
解決方案:遞歸
class GetResource: def __init__(self): self.result = {} def get_resource(self, key_str, data): """ 從dict中獲取包含指定key的k,v :param key_str: :param data: :return: """ if not isinstance(data, (dict, list, tuple)): pass elif isinstance(data, (list, tuple)): for index in data: self.get_resource(key_str, index) elif isinstance(data, dict): for k, v in data.items(): if isinstance(v, str): if key_str in k: self.result[k] = v else: self.get_resource(key_str, v) return self.result print(GetResource().get_resource(key, file_dict)) # {'刷寫(xiě)ECU': 'burn_ecu_version=ecu_name,burn_package_url,(flash_method)', 'BD升級(jí)ECU': 'bd_ecu_version=ecu_name,doip_package_url', 'ECU': 'xx'}
到此這篇關(guān)于python中三種高階函數(shù)(map,reduce,filter)的文章就介紹到這了,更多相關(guān)python高階函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python3的map與reduce實(shí)例詳解
- Python3中map(),reduce(),filter()的詳細(xì)用法
- Python學(xué)習(xí)之魔法函數(shù)(filter,map,reduce)詳解
- Python 函數(shù)編編程的三大法寶map+filter+reduce分享
- python 內(nèi)置函數(shù)-range()+zip()+sorted()+map()+reduce()+filter()
- 簡(jiǎn)單了解python filter、map、reduce的區(qū)別
- Python函數(shù)的返回值、匿名函數(shù)lambda、filter函數(shù)、map函數(shù)、reduce函數(shù)用法實(shí)例分析
- 一文詳解Python中的Map,Filter和Reduce函數(shù)
相關(guān)文章
使用python實(shí)現(xiàn)strcmp函數(shù)功能示例
這篇文章主要介紹了使用python實(shí)現(xiàn)strcmp函數(shù)功能的示例,需要的朋友可以參考下2014-03-03Python內(nèi)存管理器如何實(shí)現(xiàn)池化技術(shù)
Python中的內(nèi)存管理是從三個(gè)方面來(lái)進(jìn)行的,一對(duì)象的引用計(jì)數(shù)機(jī)制,二垃圾回收機(jī)制,三內(nèi)存池機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Python內(nèi)存管理器如何實(shí)現(xiàn)池化技術(shù)的相關(guān)資料,需要的朋友可以參考下2022-05-05如何用Python編寫(xiě)一個(gè)電子考勤系統(tǒng)
這篇文章主要介紹了用Python編寫(xiě)一個(gè)電子考勤系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02python-web根據(jù)元素屬性進(jìn)行定位的方法
這篇文章主要介紹了python-web根據(jù)元素屬性進(jìn)行定位的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12python+selenium+autoit實(shí)現(xiàn)文件上傳功能
這篇文章主要介紹了python+selenium+autoit實(shí)現(xiàn)文件上傳功能,需要的朋友可以參考下2017-08-08Python+Django實(shí)現(xiàn)接口測(cè)試工具的示例代嗎
本文主要介紹了Python+Django實(shí)現(xiàn)接口測(cè)試工具,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07在Python中畫(huà)圖(基于Jupyter notebook的魔法函數(shù))
這篇文章主要介紹了在Python中畫(huà)圖(基于Jupyter notebook的魔法函數(shù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Python subprocess庫(kù)六個(gè)實(shí)例快速掌握
這次來(lái)說(shuō)Python的第三方庫(kù)subprocess庫(kù),在python2.4以上的版本commands模塊被subprocess取代了。一般當(dāng)我們?cè)谟肞ython寫(xiě)運(yùn)維腳本時(shí),需要履行一些Linux shell的命令,Python中subprocess模塊就是專(zhuān)門(mén)用于調(diào)用Linux shell命令,并返回狀態(tài)和結(jié)果,可以完美的解決這個(gè)問(wèn)題2022-10-10python通過(guò)pil為png圖片填充上背景顏色的方法
這篇文章主要介紹了python通過(guò)pil為png圖片填充上背景顏色的方法,實(shí)例分析了Python使用pil模塊操作png圖片的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03Python中tkinter開(kāi)發(fā)的常用29種功能用法總結(jié)
tkinter(Tk?interface)是Python的標(biāo)準(zhǔn)GUl庫(kù),支持跨平臺(tái)的GUl程序開(kāi)發(fā),本文為大家整理了tkinter開(kāi)發(fā)時(shí)常用的29種功能用法,希望對(duì)大家有所幫助2023-05-05