lst = [0,1,2,3,4]
f = lambda x, y: (x[0] + y, x[1]+[x[0] + y])
print reduce(f, lst, (0, []))
Передан инициализатор ((0, [])) значит вместо первого элемента списка берем его:
f((0,[]), 0) =
(0 + 0, [] + [0 + 0]) =
(0,[0])
Результат передаем первым аргументом. Следующий элемент списка вторым:
f((0,[0]), 1) =
(0 + 1, [0] + [0 + 1]) =
(1, [0, 1])
и тд...
f((1, [0, 1]), 2) =
(1 + 2, [0, 1] + [1 + 2]) =
(3, [0, 1, 3])
f((3, [0, 1, 3]), 3) =
(3 + 3, [0, 1, 3] + [3 + 3] =
(6, [0, 1, 3, 6])
f((6, [0, 1, 3, 6]), 4) =
(6 + 4, [0, 1, 3, 6] + [6 + 4]) =
(10, [0, 1, 3, 6, 10])
.................................Тут терпение закончилось :)
>>> f((10, [0, 1, 3, 6, 10]), 5)
13: (15, [0, 1, 3, 6, 10, 15])
>>> f((15, [0, 1, 3, 6, 10, 15]), 6)
14: (21, [0, 1, 3, 6, 10, 15, 21])
>>> f((21, [0, 1, 3, 6, 10, 15, 21]), 7)
15: (28, [0, 1, 3, 6, 10, 15, 21, 28])
>>> f((28, [0, 1, 3, 6, 10, 15, 21, 28]), 8)
16: (36, [0, 1, 3, 6, 10, 15, 21, 28, 36])
>>> f((36, [0, 1, 3, 6, 10, 15, 21, 28, 36]), 9)
17: (45, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
>>>
Расписывать список на 10 элементов у меня терпения не хватило… но думаю суть ясна
PS: Может я глупый, но практически ни разу не видел reduce() понятный с первого взгляда… в топку их. ИМХО.