Ответ 1
Как говорит Гвидо в своем Судьба reduce() в Python 3000:
Итак, теперь сведем(). Это на самом деле тот, которого я всегда ненавидел больше всего, потому что, помимо нескольких примеров с участием + или *, почти каждый раз, когда я вижу вызов reduce() с нетривиальным аргументом функции, мне нужно захватить ручку и бумагу диаграммы, которые фактически подаются в эту функцию, прежде чем я пойму, что должен делать метод reduce(). Поэтому, на мой взгляд, применимость метода reduce() в значительной степени ограничена ассоциативными операторами, и во всех остальных случаях лучше написать цикл накопления явно.
Существует отличный пример путаницы reduce
в Functional Programming HOWTO:
Быстро, что делает следующий код?
total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
Вы можете понять это, но требуется время распутать выражение, чтобы выяснить что происходит. Использование коротких вложенных инструкций def делает вещи немного лучше:
def combine (a, b): return 0, a[1] + b[1] total = reduce(combine, items)[1]
Но было бы лучше всего, если бы я просто использовал цикл for:
total = 0 for a, b in items: total += b
Или выражение sum() и генератор:
total = sum(b for a,b in items)
Многие функции сокращения() более понятны при написании как для циклов.