functools.reduce ()
Чтобы понять это, мы должны сначала понять, как работает reduce
, Reduce принимает 3 аргумента:
- Функция
- Итерируемый элемент
- Инициализатор.
Давайте сосредоточимся на функции и итерируемом элементе, чтобы понять, как функция вызывается
Ниже приведены официальные документы functools:
functools.reduce(function, iterable[, initializer])
Примените функцию двух аргументов кумулятивно к элементам итерируемых слева направо, чтобы свести итерируемое к одному значению. Например, Reduce (лямбда x, y: x + y, [1, 2, 3, 4, 5]) вычисляет ((((1 + 2) +3) +4) +5). Левый аргумент x - это накопленное значение, а правый аргумент y - это значение обновления из итерируемого. Если присутствует необязательный инициализатор, он помещается перед элементами итерируемого в вычислении и служит по умолчанию, когда итерируемый является пустым. Если инициализатор не задан и итеративный содержит только один элемент, возвращается первый элемент.
Примерно эквивалентно:
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
Здесь вы можете понять, что он принимает функцию передается в первом аргументе и выполняет его со значением, element в качестве аргументов для переданной функции. Обратите внимание, что каждый элемент element
во втором аргументе iterable
. Поэтому, когда вы вызвали reduce(call, funcs, 1)
,
Произошло следующее: Поскольку initializer = 1, value = initializer,
для каждого удовольствия c в функциях, произошло следующее
звонок (1, веселье c)
TLDR; Когда вы заменяете y и f, вы пытаетесь вызвать 1 (fun c), что невозможно, и поэтому первое начальное решение работает, потому что оно вызывает fun c (1)
Ссылка: Python Документы - functools