2013-10-25 120 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")