Уменьшить функцию с тремя параметрами

Как работает функция reduce в python3 с тремя параметрами вместо двух. Итак, для двух,

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

Я получаю этот. Это просто суммирует все элементы в tup. Однако, если вы дадите функции уменьшения три параметра, как показано ниже,

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

это даст вам значение 12. Я проверил документацию на python3, и он говорит, что третий аргумент является инициализатором. Тем не менее, что такое инициализатор по умолчанию, если третий аргумент не вставлен?

Ответ 1

Если вы опустите третий параметр, в качестве инициализатора используется первое значение из tup.

Или, говоря иначе, 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

Обратите внимание, что вместо iterable в качестве первого значения вместо iterable используется initializer, а не None.

Ответ 2

уменьшить дополнительный третий аргумент:

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

Ответ 3

Предоставляя кортеж в качестве третьего параметра, мы сможем вычислить и вернуть из нескольких значений.

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,)))