我无法理解以下代码段:
>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)
reduce函数如何产生(1,2,3,4,5)的元组?
答案 0 :(得分:12)
如果你将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)
答案 1 :(得分:3)
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
,所以在你的情况下()
是正确的:< / p>
reduce(lambda t1, t2: t1 + t2, lot, ())
但没有它,如果lot
没有元素(TypeError: reduce() of empty sequence with no initial value
),则只会遇到麻烦。
答案 2 :(得分:1)
减少(...) reduce(function,sequence [,initial]) - &gt;值
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.
答案 3 :(得分:1)
让我们跟踪reduce
result =(1,2)+(3,4)
result = result +(5,)
请注意,您的缩减会连接元组。
答案 4 :(得分:0)
reduce将函数和迭代器作为参数。该函数必须接受两个参数。
它通过迭代器进行迭代是什么减少。首先,它将前两个值发送给函数。然后它将结果与下一个值一起发送,依此类推。
所以在你的情况下,它需要元组中的第一个和第二个项,(1,2)和(3,4)并将它们发送到lambda函数。该功能将它们加在一起。结果再次与第三项一起发送到lambda函数。由于元组中没有更多项,因此返回结果。