1 回答

TA貢獻1796條經驗 獲得超7個贊
functools.reduce()
要理解這一點,我們首先應該了解它是如何reduce
工作的,reduce 需要 3 個參數:
一個函數
可迭代元素
一個初始化器。
讓我們關注函數和可迭代元素來了解函數是如何調用的
下面是functools的官方文檔:
functools.reduce(function, iterable[, initializer])
將兩個參數的函數從左到右累積應用于iterable的項目,以將iterable減少為單個值。例如,reduce(lambda 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
在這里你可以理解,它接受第一個參數中傳遞的函數,并以 value、element 作為傳遞函數的參數來執行它。請注意,元素是 eachelement
在第二個參數iterable
中。所以當你打電話時reduce(call, funcs, 1)
,
發生以下情況:由于初始化程序=1,值=初始化程序,
對于 funcs 中的每個 func,發生了以下情況
調用(1,函數)
TLDR; 當您替換 y 和 f 時,您正在嘗試調用 1(func),這是不可能的,這就是第一個初始解決方案有效的原因,因為它調用了 func(1)
添加回答
舉報