В чем проблема с reduce()?


в Сети, похоже, много жарких дискуссий об изменениях функции reduce() в python 3.0 и о том, как ее следует удалить. Мне немного трудно понять, почему это так; я считаю вполне разумным использовать его в различных случаях. Если бы презрение было просто субъективным, я не могу себе представить, что такое большое количество людей будет заботиться об этом.

чего мне не хватает? В чем проблема с reduce()?

4 59

4 ответа:

как говорит Гвидо в своем судьба reduce() в Python 3000 сообщение:

так что теперь уменьшите (). Это на самом деле тот, который я всегда ненавидел больше всего, потому что, кроме нескольких примеров, связанных с + или*, почти каждый раз, когда я вижу вызов reduce() с нетривиальным аргументом функции, мне нужно захватить ручку и бумагу, чтобы показать, что на самом деле подается в эту функцию, прежде чем я пойму, что должен делать reduce (). Так что на мой взгляд, применимость reduce () в значительной степени ограничивается ассоциативными операторами, и во всех других случаях лучше явно записать цикл накопления.

есть отличный пример запутанного reduce на функциональное программирование 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)

многие применения reduce () более понятны при написании как для циклов.

reduce() не удаляется - он просто перемещается в functools модуль. Рассуждение Гвидо заключается в том, что за исключением тривиальных случаев, таких как суммирование, код, написанный с использованием reduce() обычно понятнее, когда написано как цикл накопления.

люди беспокоятся, что это поощряет запутанный стиль программирования, делая что-то, что может быть достигнуто с помощью более четких методов.

Я не против уменьшить себя, я также считаю это полезным инструментом иногда.

основная причина существования reduce заключается в том, чтобы избежать написания явных для циклов с аккумуляторами. Несмотря на то, что python имеет некоторые возможности для поддержки функционального стиля, это не рекомендуется. Если вам нравится "реальный", а не "питонический" функциональный стиль - используйте современный Lisp (Clojure?) или Хаскель вместо этого.