Python内建了map()
和reduce()
函数。
map
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
举例说明,有一个函数f(x)=x2,要把这个函数作用在[1, 2, 3, 4, 5, 6, 7, 8, 9]
上,就以用map
>>> def f(x):... return x*x...>>> r = map(f,[1, 2, 3, 4, 5, 6, 7, 8, 9])>>> r
map
传入的第一个参数是f
,即函数对象本身。由于结果r
是一个Iterator
惰性序列,因此通过list()
函数让它把整个序列都计算出来并返回一个list。
如果不用map()
,写一个循环,也可以实现结果:
>>> L = []>>> for n in [1,2,3,4,5,6,7,8,9]:... L.append(f(n))...>>> L[1, 4, 9, 16, 25, 36, 49, 64, 81]
但是实现效果不够map清晰,看不出“把f(x)作用在list的每一个元素并把结果生成一个新的list”
所以,map()
作为高阶函数,事实上把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串
>>> list(map(str,[1,2,3,4,5,6,7,8,9]))['1', '2', '3', '4', '5', '6', '7', '8', '9']
只需要一行代码。
reduce
reduce
把一个函数作用在一个序列[x1,x2,x3..]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方说对一个序列求和
>>> from functools import reduce>>> def add(x,y):... return x+y...>>> reduce(add,[1,2,3,4])10
当然求和运算也可以直接使用sum()
没必要动用reduce
但是如果要把序列[1,2,3,4]
转换成整数1234
,reduce
就可以派上用场
>>> def fn(x,y):... return x*10+y...>>> reduce(fn,[1,2,3,4])1234