激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python中三種高階函數(map,reduce,filter)詳解

python中三種高階函數(map,reduce,filter)詳解

2022-02-15 12:47網名余先生 Python

在Python中,函數其實也是一種數據類型,今天重點給大家介紹python中三種高階函數(map,reduce,filter)的相關知識,感興趣的朋友一起看看吧

  • map(function,seq[,seq2]) 接收至少兩個參數,基本作用為將傳入的函數依次作用到序列的每個元素,并且把結果作為新的序列 返回一個可迭代的map對象

function:函數對象

py2中可為None,作用等同于zip()
如:

python中三種高階函數(map,reduce,filter)詳解

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]

python中三種高階函數(map,reduce,filter)詳解
python中三種高階函數(map,reduce,filter)詳解

結合圖 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)
  • reduce(function,seq[,initial])接收三個參數,基本作用為對序列進行累積;并返回結果。python3中reduce需從functools模塊導入

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 激情久久精品 | 91九色网 | 蜜桃网站在线观看 | 中国videos露脸hd | 性欧美大战久久久久久久免费观看 | 美女网站色免费 | 成人资源在线 | 久久蜜桃精品一区二区三区综合网 | 亚洲小视频在线观看,com | 亚洲精品午夜视频 | 九九热九九爱 | 免费看污视频在线观看 | 日本a∨精品中文字幕在线 国产精品片www48888 | 成人偷拍片视频在线观看 | 欧美成人高清视频 | 中文字幕观看 | 国产做爰全免费的视频黑人 | 久久草在线观看视频 | 午夜天堂在线视频 | 伊人99在线| 亚洲国产成人久久一区www妖精 | 久色网站| 国内精品久久久久久久久久 | 中文字幕免费看 | 亚洲激情91 | 久久久久北条麻妃免费看 | 成年人精品视频 | 久久影片 | 黄色片视频观看 | 国产色爱综合网 | 91成人影库 | 久久宗合色 | 日本欧美一区二区三区在线观看 | 成人午夜在线观看视频 | 久久久久久久久成人 | 黄色网址进入 | 国产在线精品一区二区 | 久久久精品视频网站 | 午夜色片 | 久久在线观看 | 久久av喷吹av高潮av懂色 |