22

函数如何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 的文档,它说第三个参数是一个初始化程序。也就是说,如果没有插入第三个参数,那么默认初始化程序是什么?

4

3 回答 3

26

如果省略第三个参数,则第一个值 fromtup用作初始值设定项。

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

此外,这意味着如果第二个参数是一个序列,则第三个参数作为默认值,就像只有一个元素(并且没有显式初始化参数)的第二个参数一样,将是默认返回值。

functools.reduce()文档包括该函数的 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

于 2013-10-25T11:59:26.117 回答
1

提供一个元组作为第三个参数,我们将能够计算并从减少多个值返回。

from functools import reduce
def mean(my_list):                  # == sum(my_list) / len(my_list)
    return (lambda x: x[0]/x[1]) (reduce(lambda x, y : (x[0]+y, x[1]+1), 
                                                my_list, (0, 0,)))
于 2018-04-02T13:02:39.193 回答
0

减少可选的第三个参数:

>>> import functools
>>> test = []
>>> functools.reduce((lambda x,y: x+y), test, "testing")
于 2017-01-18T05:35:06.740 回答