map
map()函数接受两个值,一个是函数,另一个是Iterable,map将传入的函数依次作用于序列的每一个元素,并将结果作为一个新的Iterator返回。
我们想把f(x)=x²作用于一个列表[1,2,3,4,5,6,7,8,9],就可以这样做
>>> def f(x): return x*x>>> res = map(f,[1,2,4,5,6,7,8,9])>>> print(res)
map()传入的第一个参数是f,结果res是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
还可以计算复杂的函数,将数字转化为字符串
>>> r = map(str,[1,2,3,4,5])>>> list(r)['1', '2', '3', '4', '5']
reduce
reduce把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
把[1,2,3,4]变成整数1234,reduce就派上用场了
>>> from functools import reduce >>> def fn(x,y): return x*10+y>>> reduce(fn,[1,2,3,4])1234
有个很有意思的例子,考虑到str本身也是一个序列,我可以配合map函数将str转换成int,其实没什么卵用,因为python提供了int()函数
>>> def fn(x,y): return x*10+y>>> def char_to_num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]>>> reduce(fn,map(char_to_num,'13568'))13568
先用map()函数将char_to_num()作用于序列‘13568’,得到[1,3,5,6,8]这样一个Iterator对象,再利用reduce()函数处理。就实现了将str转换为int的功能。