我无法理解以下代码段:
>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)
reduce 函数如何产生 (1,2,3,4,5) 的元组?
我无法理解以下代码段:
>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)
reduce 函数如何产生 (1,2,3,4,5) 的元组?
如果你把它分解lambda
成一个函数会更容易,所以会更清楚发生了什么:
>>> def do_and_print(t1, t2):
print 't1 is', t1
print 't2 is', t2
return t1+t2
>>> reduce(do_and_print, ((1,2), (3,4), (5,)))
t1 is (1, 2)
t2 is (3, 4)
t1 is (1, 2, 3, 4)
t2 is (5,)
(1, 2, 3, 4, 5)
reduce()
顺序应用一个函数,链接一个序列的元素:
reduce(f, [a,b,c,d], s)
是相同的
f(f(f(f(s, a), b), c), d)
等等。在您的情况下,这f()
是一个 lambda 函数 ( lambda t1, t2: t1 + t2
),它只是将它的两个参数相加,所以你最终得到
(((s + a) + b) + c) + d
并且因为添加序列的括号没有任何区别,这是
s + a + b + c + d
或使用您的实际值
(1, 2) + (3, 4) + (5,)
如果s
未给出,则第一项尚未完成,但通常中性元素用于s
,因此在您的情况下()
是正确的:
reduce(lambda t1, t2: t1 + t2, lot, ())
lot
但是没有它,只有在没有元素(TypeError: reduce() of empty sequence with no initial value
)的情况下才会遇到麻烦。
减少(...)减少(函数,序列[,初始])->值
Apply a function of two arguments cumulatively to the items of a sequence, from left to right, so as to reduce the sequence to a single value. For example, reduce(lambda x, y: x+y, ((1, 2), (3, 4), (5))) calculates (((1+2)+(3+4))+5). If initial is present, it is placed before the items of the sequence in the calculation, and serves as a default when the sequence is empty.
让我们追踪reduce
结果 = (1,2) + (3,4)
结果 = 结果 + (5, )
请注意,您的归约连接了元组。
reduce 接受一个函数和一个迭代器作为参数。该函数必须接受两个参数。
reduce 所做的是它遍历可迭代对象。首先它将前两个值发送到函数。然后它将结果与下一个值一起发送,依此类推。
因此,在您的情况下,它将元组中的第一项和第二项 (1,2) 和 (3,4) 发送到 lambda 函数。该函数将它们加在一起。结果与第三项一起再次发送到 lambda 函数。由于元组中没有其他项目,因此返回结果。