В чем проблема с reduce()?
в Сети, похоже, много жарких дискуссий об изменениях функции reduce() в python 3.0 и о том, как ее следует удалить. Мне немного трудно понять, почему это так; я считаю вполне разумным использовать его в различных случаях. Если бы презрение было просто субъективным, я не могу себе представить, что такое большое количество людей будет заботиться об этом.
чего мне не хватает? В чем проблема с reduce()?
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?) или Хаскель вместо этого.