В чем проблема с помощью limit ()? - PullRequest
64 голосов
/ 08 октября 2008

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

Чего мне не хватает? В чем проблема с помощью limit ()?

Ответы [ 4 ]

66 голосов
/ 08 октября 2008

Как говорит Гвидо в своем Судьба редукции () в Python 3000 post:

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

Отличный пример запутанного 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

Или встроенная сумма () и выражение генератора:

total = sum(b for a,b in items)

Многие случаи использования метода Reduce () более понятны при написании циклов.

34 голосов
/ 08 октября 2008

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

8 голосов
/ 08 октября 2008

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

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

2 голосов
/ 16 мая 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...