python中的map和reduce

下面的介绍是基于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]

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值