1 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
functools.reduce()
要理解這一點(diǎn),我們首先應(yīng)該了解它是如何reduce
工作的,reduce 需要 3 個(gè)參數(shù):
一個(gè)函數(shù)
可迭代元素
一個(gè)初始化器。
讓我們關(guān)注函數(shù)和可迭代元素來(lái)了解函數(shù)是如何調(diào)用的
下面是functools的官方文檔:
functools.reduce(function, iterable[, initializer])
將兩個(gè)參數(shù)的函數(shù)從左到右累積應(yīng)用于iterable的項(xiàng)目,以將iterable減少為單個(gè)值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 計(jì)算 ((((1+2)+3)+4)+5)。左邊的參數(shù) x 是累積值,右邊的參數(shù) y 是迭代的更新值。如果存在可選的初始值設(shè)定項(xiàng),則在計(jì)算中將其放置在可迭代項(xiàng)之前,并在可迭代項(xiàng)為空時(shí)用作默認(rèn)值。如果沒(méi)有給出初始化程序并且可迭代只包含一個(gè)項(xiàng)目,則返回第一個(gè)項(xiàng)目。
大致相當(dāng)于:
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
在這里你可以理解,它接受第一個(gè)參數(shù)中傳遞的函數(shù),并以 value、element 作為傳遞函數(shù)的參數(shù)來(lái)執(zhí)行它。請(qǐng)注意,元素是 eachelement
在第二個(gè)參數(shù)iterable
中。所以當(dāng)你打電話時(shí)reduce(call, funcs, 1)
,
發(fā)生以下情況:由于初始化程序=1,值=初始化程序,
對(duì)于 funcs 中的每個(gè) func,發(fā)生了以下情況
調(diào)用(1,函數(shù))
TLDR; 當(dāng)您替換 y 和 f 時(shí),您正在嘗試調(diào)用 1(func),這是不可能的,這就是第一個(gè)初始解決方案有效的原因,因?yàn)樗{(diào)用了 func(1)
添加回答
舉報(bào)