2013-10-25 72 views
7

reduce函数如何使用三个参数而不是两个参数在python3中工作。 因此,对于两个,使用三个参数减少函数

tup = (1,2,3) 
reduce(lambda x, y: x+y, tup) 

我得到这一个。这只是总结了tup中的所有元素。但是,如果你给Reduce函数三个参数是这样下面,

tup = (1,2,3) 
reduce(lambda x, y: x+y, tup, 6) 

这将给你的12值。 我检查了python3的文档,它说第三个参数是一个初始值设定项。那就是说,如果没有插入第三个参数,那么默认的初始化器是什么?

回答

7

如果您省略了第三个参数,那么将使用tup第一个值作为初始值设定项。

或者,换一种方法,reduce()将可选第三个参数放置在第二个参数的值之前(如果存在)。

此外,这意味着,如果所述第二参数是一个序列,其第三个参数作为缺省,正如仅一个元件(没有显式的初始化参数)的第二参数,将是默认返回值。

functools.reduce() documentation包括函数的Python版本:

def reduce(function, iterable, initializer=None): 
    it = iter(iterable) 
    if initializer is None: 
     value = next(it) 
    else: 
     value = initializer 
    for element in it: 
     value = function(value, element) 
    return value 

注意如何initializer,当不None,被用作第一值,而不是从iterable第一值。

+0

好,我似乎明白了! 'next'在这个函数中做了什么? – chanpkr

+1

@ChanPark:查看['next()'函数文档](http://docs.python.org/3/library/functions.html#next);从迭代器中检索下一个值。如果'iterable'是一个元组,那么这是第一个索引。 –

+1

请注意,实际的reduce函数确实接受'None'作为第三个参数。 – georg

0

减少可选的第三个参数:

>>> import functools 
>>> test = [] 
>>> functools.reduce((lambda x,y: x+y), test, "testing")