下面的介绍是基于python2.7.
MapReduce,好熟悉的名字!
但我们今天要说的是map和reduce,这是2个python的内置函数。
我们先看看map是做什么用的
def map(function, sequence, *sequence_1): # real signature unknown; restored from __doc__
"""
map(function, sequence[, sequence, ...]) -> list
Return a list of the results of applying the function to the items of
the argument sequence(s). If more than one sequence is given, the
function is called with an argument list consisting of the corresponding
item of each sequence, substituting None for missing values when not all
sequences have the same length. If the function is None, return a list of
the items of the sequence (or a list of tuples if more than one sequence).
"""
return []
这个函数带有3个参数:
第一个是个函数,第二个是序列,第三个是可变参数,也就是说这个函数至少要有2个参数,但是也可以有多个参数,除了第一个是个函数外,其他的都是序列。
那它到底是做什么的呢? map函数会将每个序列的元素取出来,作为参数传递给function,然后将function所有返回的结果作为一个list返回给map的调用者。 语言描述不够直观,举例子吧。
定义一个函数fun(x), 对x取平方
def fun(x):
return x*x
然后我们用map来处理一个序列 [1,2,3,4]
ret = map(fun, [1,2,3,4])
print ret
我们得到结果将会是 [1,4,5,16]
你会发现,我们map函数只有2个参数。那么带有3个参数或更多时是怎么处理数据的呢? 继续举例子。
定义一个函数,能够接收任意个参数,返回所有参数的和
def fun(*args):
ret = 0
for arg in args:
if arg is not None:
ret += arg
return ret
然后我们处理2个序列,[1,2,3]和[4,5,6]
ret = map(fun, [1,2,3], [4,5,6])
print ret
我们得到的结果会是 [5,7,9]
也就是说,map函数首先取出1和4,调用func,将结果放入一个list,然后再取出2和5,调用func,将结果存入list,依次类推。。。
现在大家明白map都做了什么了吧。
但是,我们刚才举的例子中2个序列长度一样,如果长度不一样会怎么样呢? 如果长度不一样,那么长度短的那个,会用None凑个数,这也是为什么我要判断arg是不是None。
map说完了,下面开始说reduce吧
def reduce(function, sequence, initial=None): # real signature unknown; restored from __doc__
"""
reduce(function, sequence[, initial]) -> value
Apply a function of two arguments cumulatively to the items of a sequence,
from left to right, so as to reduce the sequence to a single value.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
((((1+2)+3)+4)+5). If initial is present, it is placed before the items
of the sequence in the calculation, and serves as a default when the
sequence is empty.
"""
pass
先说参数,第一个是个函数,第二个是序列,第三个是值,如果提供了第三个参数,它会被放到序列的第一个位置上参与计算。
假设我们传入的函数fun,序列是[1,2,3,4]
那么结果就是 fun( fun( fun(1,2),3),4), 也就是先把1,2作为参数调用fun,然后以fun的返回值和3作为参数调用fun,依次类推。最后得到一个数。 至于fun进行什么样的计算就由你决定了。
如果提供了第三个参数: 函数fun,序列是[1,2,3,4],第三参数是5
这时,其实会转换成:函数fun,序列是[5,1,2,3,4]