Python减少了解释

时间:2012-11-28 10:54:47

标签: python functional-programming reduce

我无法理解以下代码段:

>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)

reduce函数如何产生(1,2,3,4,5)的元组?

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函数。由于元组中没有更多项,因此返回结果。