参考链接:Python高阶函数Map、Filter、Reduce
Map
Map() 是 python 内置函数,它会根据所传递的函数对指定的序列(可迭代)做映射,原型如下:
map(func, *iterables) --> map object
参数function:
是一个函数,是自定义或者 python 内置的函数都可以。
参数\*iterable:
是可迭代的对象,比如我们常用的列表,元组等。
返回值map object:
表示 map 函数的返回值是一个 map 对象。
简单的来说这个 Map 函数的功能就是使用 func 对传入的 iterable 的每一个元素(比如列表的每一个元素)进行处理,返回对象如
<map object at 0x00000272BB702128>
注意到参数 iterable 是加了符号“*”的,所以说这个参数的意思是可以接受多个可迭代的对象的。
Function为自定义函数
def self_test(x):
return x + 2
string = [1,2,3,4,5,6]
res = map(self_test, string)
print(list(res))
#输出 [3, 4, 5, 6, 7, 8]
上述代码中 向 map 函数中传入了自定义的 self_test 函数,函数加对传入的元素加2的处理
多个Iterable
之前说过,参数 *iterable 可以是多个可迭代对象的:
def func(x,y,z):
return x**2, y**2, z**2
List1 = [1, 2]
List2 = [1, 2, 3, 4]
List3 = [1, 2, 3, 4, 5]
res = map(func, List1, List2, List3)
print(list(res))
#输出 [(1, 1, 1), (4, 4, 4)]
map() 函数中传入了多个 iterable。输出的结果中列表的长度为 2。这里有一个知识点:输出的 list 的长度取决于*iterable 中传入的 litrable 的最小长度,比如在上述中 List1、List2 和 List3 中最短的为 List1,长度为 2。
For循环取内容
#for循环来取出内容
def add_test(x):
return x + 2
string = [1,2,3,4,5,6]
res = map(add_test, string)
res_ls=[]
for i in res:
res_ls.append(i)
print(res_ls)
Filter
filter() 是 python 内置函数,它会根据所传递的函数对指定的对象(可迭代)做过滤,原型如下:
filter(function or None, iterable) --> filter object
可以看出该函数接收两个参数,第一个为函数,第二个为可迭代对象,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表(或迭代器)中。
Filter()实例
def select_element(string):
if 'p' in string:
return True
# return 1
else:
return False
# return 0
res_1 = filter(select_element, ['1','2','3','python'])
res_2 = filter(select_element, {'python':1,'知识':2,'学堂':3})
print(list(res_1))
print(list(res_2))
# 输出均为
# ['python']
# ['python']
Reduce
reduce() 是一个以函数以及 sequence 为参数的高阶函数,其返回值为一个 value 值而不是迭代器对象。其原型如下:
reduce(function, sequence[, initial]) -> value
但 reduce() 传入的函数必须接收两个参数,比如 func (x,y) 满足条件,但是 func(x,y,z) 并不满足条件。
Initial 为初始化的一个参数,可不填。(如果没有指定 Initial的值那么其为 sequence 的第一个元素的值)。
Reduce()实例
reduce 每一次迭代,都将上一次的迭代结果与下一个元素一起传入 function 函数中,取得值以后将其与下一个元素一起继续下传…找到使用到 sequence 中的最后一个元素。
# 需要functools从导入
from functools import reduce
def func(x, y):
return x + y
string = [1, 3, 5, 7, 9]
result_1 = reduce(func,string)
result_2 = reduce(func,string,100)
print(result_1) # output:25
print(result_2) # output:125
上述 result_2 使用 initial = 100。
其中25的值可以这样理解:25 = ((((1+3)+5)+7)+9)。
其中125的值可以这样理解:125 = (((((100+1)+3)+5)+57)+9)。