В чем проблема с сокращением()?

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

Что мне не хватает? В чем проблема с сокращением()?

Ответ 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)

Многие функции сокращения() более понятны при написании как для циклов.

Ответ 2

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

Ответ 3

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

Я не против себя, я иногда нахожу его полезным инструментом.

Ответ 4

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