1,
Python 内建了 map()和 reduce()函数.
如果你读过 Google 的那篇大名鼎鼎的论文 "MapReduce: Simplified Data Processing on Large Clusters http://research.google.com/archive/mapreduce.html", 你就能大概明白 map/reduce 的概念.
我们先看 map.map()函数接收两个参数, 一个是函数, 一个是 Iterable,map 将传入的函数依次作用到序列的每个元素, 并把结果作为新的 Iterator 返回.
举例说明, 比如我们有一个函数 f(x)=x2, 要把这个函数作用在一个 list [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])
- >>>list(r)
- [1, 4, 9, 16, 25, 36, 49, 64, 81]
- map
map()传入的第一个参数是 f, 即函数对象本身. 由于结果 r 是一个 Iterator,Iterator 是惰性序列, 因此通过 list()函数让它把整个序列都计算出来并返回一个 list.
你可能会想, 不需要 map()函数, 写一个循环, 也可以计算出结果:
- l = []
- for n in [1,2,3,4,5,6,7,8,9] :
- l.append(f(n))
- print(l)
- View Code
的确可以, 但是, 从上面的循环代码, 能一眼看明白 "把 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']
结果
只需要一行代码.
2, 再看 reduce 的用法
但是如果要把序列 [1, 3, 5, 7, 9] 变换成整数 13579,reduce 就可以派上用场:
- from functools import reduce
- def fn(x,y):
- return x * 10 + y
- >>>reduce(fn(1,3,5,7,9))
- 13579
reduce 内置函数
来源: http://www.bubuko.com/infodetail-3003645.html