6

我无法理解以下代码段:

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

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

4

5 回答 5

14

如果你把它分解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)
于 2012-11-28T11:01:22.863 回答
4

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)的情况下才会遇到麻烦。

于 2012-11-28T12:47:11.797 回答
1

减少(...)减少(函数,序列[,初始])->值

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.
于 2012-11-28T10:58:33.240 回答
1

让我们追踪reduce

结果 = (1,2) + (3,4)

结果 = 结果 + (5, )

请注意,您的归约连接了元组。

于 2012-11-28T10:59:12.207 回答
0

reduce 接受一个函数和一个迭代器作为参数。该函数必须接受两个参数。

reduce 所做的是它遍历可迭代对象。首先它将前两个值发送到函数。然后它将结果与下一个值一起发送,依此类推。

因此,在您的情况下,它将元组中的第一项和第二项 (1,2) 和 (3,4) 发送到 lambda 函数。该函数将它们加在一起。结果与第三项一起再次发送到 lambda 函数。由于元组中没有其他项目,因此返回结果。

于 2012-11-28T11:07:34.500 回答