輸入的第二代碼片段是單元素的列表 - 這是一個退化的情況下可調用甚至沒有叫。
考慮下面的例子:
def my_sum(*args):
print "my_sum called with", args
return sum(*args)
x = [1, 2, 3]
reduce(my_sum, [b for b in x if b > 2])
# nothing gets printed, value 3 is returned, since it's only element in list
現在考慮您的失敗案例:
reduce(my_sum, [b for b in x if b > 0])
輸出是:
my_sum called with (1, 2)
[exception traceback]
相當於調用內置的總和爲sum(1, 2)
,導致相同您引用的例外。
sum
signature不遵循縮小功能的規則。 sum(iterable[, start])
需要兩個參數(如預期),但其中第一個必須是可迭代,其中第二個是可選初始值。
reduce
要求功能採取兩個參數,其中,(引用文檔):
左邊參數,x爲累積值和右參數, Y,從迭代的更新值。
我們可以清楚地看到這些接口是不一致的。正確的調用將是這樣的:
def reduce_sum(accumulator, new_value):
return accumulator + new_value
reduce(reduce_sum, [b for b in x if b > 0])
您可能還需要學習'filter'玩,該列表理解是不必要的冗長 –