python中三種高階函數(shù)(map,reduce,filter)詳解
- map(function,seq[,seq2]) 接收至少兩個參數(shù),基本作用為將傳入的函數(shù)依次作用到序列的每個元素,并且把結(jié)果作為新的序列 返回一個可迭代的map對象
function:函數(shù)對象
py2中可為None,作用等同于zip()
如:

py3中不可為None,None是不可調(diào)用、不可迭代對象
seq:可迭代對象,可以傳一個或多個
# 傳一個: def func(i):return i*2 print([i for i in map(func,[1,'2'])]) # [2,'22'] # 傳多個 def func2(x,y):return x+y print([i for i in map(func2,[1,2],[2,3])]) # [3, 5]


結(jié)合圖 map()的作用可以理解為:
# 傳一個時 seq=[1,'2'] result=[] def func(x):return x*2 for i in seq: result.append(func(i)) print(result) # 傳多個時 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)多個可迭代對象的長度不一致時,map只會取最短組合;同時每個可迭代對象相應(yīng)位置參數(shù)類型需一致!(除了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對象
如:
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)接收兩個參數(shù),基本作用是對可迭代對象中的元素進(jìn)行過濾;并返回一個新的可迭代filter對象
function:函數(shù)對象,返回值必須是個boolean值
seq:可迭代對象
如:獲取所有小寫的字符串
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])接收三個參數(shù),基本作用為對序列進(jìn)行累積;并返回結(jié)果。python3中reduce需從functools模塊導(dǎo)入
function:函數(shù)對象
seq: 可迭代對象
initial:初始值,選填參數(shù)
工作過程是:
reduce在迭代seq的過程中,第一次先把 seq的前兩個元素傳給 函數(shù)function,函數(shù)處理后,再把得到的結(jié)果和第三個元素作為兩個參數(shù)再次傳遞給函數(shù)function, 函數(shù)處理后得到的結(jié)果又和第四個元素作為兩個參數(shù)傳給函數(shù)function 依次類推,直至seq被迭代完。 如果傳入了 initial 值, 那么首次傳遞的兩個元素則是 initial值 和 第一個元素。經(jīng)過一次次累計計算之后得到一個匯總返回值。
如:求和
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è)我們要取出字典的key中包含某個關(guān)鍵字的鍵值對
如:取出下列字典中key值包含ECU的鍵值對
key = "ECU"
file_dict = {'value': 'name',
'刷寫ECU': 'burn_ecu_version=ecu_name,burn_package_url,(flash_method)',
'BD升級ECU': 'bd_ecu_version=ecu_name,doip_package_url',
'設(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)
# {'刷寫ECU': 'burn_ecu_version=ecu_name,burn_package_url,(flash_method)', 'BD升級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)無法過濾出嵌套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))
# {'刷寫ECU': 'burn_ecu_version=ecu_name,burn_package_url,(flash_method)', 'BD升級ECU': 'bd_ecu_version=ecu_name,doip_package_url', 'ECU': 'xx'}
到此這篇關(guān)于python中三種高階函數(shù)(map,reduce,filter)的文章就介紹到這了,更多相關(guān)python高階函數(shù)內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信