搜了很多介紹,很多解釋者也給了很多例子,但是總感覺模模糊糊的,直到看到官方的原函數,豁然開朗。
官方解釋:
將一個可迭代的對象應用到一個帶有兩個參數的方法上,我們稱之爲appFun,遍歷這個可迭代對象,將其中的元素依次作爲appFun的參數,但這個函數有兩個參數,作爲哪個參數呢?有這樣的規則,看一下下面reduce方法的實現,有三個參數,第一個參數就是上面說的appFun,第二個參數就是那個可迭代的對象,而第三個呢?當調用reduce方法的時候給出了initializer這個參數,那麼第一次調用appFun的時候這個參數值就作爲第一個參數,而可迭代對象的元素依次作爲appFun的第二個參數;如果調用reduce的時候沒有給出initializer這個參數,那麼第一次調用appFun的時候,可迭代對象的第一個元素就作爲appFun的第一個元素,而可迭代器的從第二個元素到最後依次作爲appFun的第二個參數,除第一次調用之外,appFun的第一個參數就是appFun的返回值了。例如reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),計算1到5的和,因爲沒有給定initializer參數,所以第一次調用x+y時,x=1,即列表的第一個元素,y=2,即列表的第二個元素,之後返回的1+2的結果作爲第二次調用x+y中的x,即上一次的結果,y=2,即第二個元素,依次類推,知道得到1+2+3+4+5的結果。
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
try:
initializer = next(it)
except StopIteration:
raise TypeError('reduce() of empty sequence with no initial value')
accum_value = 0
for x in iterable:
accum_value = function(accum_value, x)
return accum_value