- map(function,seq[,seq2]) 接收至少兩個參數,基本作用為將傳入的函數依次作用到序列的每個元素,并且把結果作為新的序列 返回一個可迭代的map對象
function:函數對象
py2中可為None,作用等同于zip()
如:
py3中不可為None,None是不可調用、不可迭代對象
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]
結合圖 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)
當多個可迭代對象的長度不一致時,map只會取最短組合;同時每個可迭代對象相應位置參數類型需一致!(除了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參數可以是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)接收兩個參數,基本作用是對可迭代對象中的元素進行過濾;并返回一個新的可迭代filter對象
function:函數對象,返回值必須是個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)
function:函數對象
seq: 可迭代對象
initial:初始值,選填參數
工作過程是:
reduce在迭代seq的過程中,第一次先把 seq的前兩個元素傳給 函數function,函數處理后,再把得到的結果和第三個元素作為兩個參數再次傳遞給函數function, 函數處理后得到的結果又和第四個元素作為兩個參數傳給函數function 依次類推,直至seq被迭代完。 如果傳入了 initial 值, 那么首次傳遞的兩個元素則是 initial值 和 第一個元素。經過一次次累計計算之后得到一個匯總返回值。
如:求和
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
結合實際:假設我們要取出字典的key中包含某個關鍵字的鍵值對
如:取出下列字典中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", "設置證書": "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"}
方法二:使用推導式
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))]))
細心的同學肯定發現無法過濾出嵌套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"}
到此這篇關于python中三種高階函數(map,reduce,filter)的文章就介紹到這了,更多相關python高階函數內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/micheryu/p/15430271.html