Альтернатива Python, чтобы уменьшить () - PullRequest
36 голосов
/ 28 февраля 2012

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

Со многими другими стандартными функциональными элементами программирования (карта и т. Д.)ясные альтернативы доступны.Например, большую часть времени map() лучше записать как понимание списка.

Я хотел бы знать, есть ли подобная «более питоническая» альтернатива функции Reduce.У меня есть некоторый опыт в области функционального программирования (в частности, ML), поэтому reduce() часто возникает у меня в голове, когда я думаю о решении, но если есть лучший способ сделать это (если не развернуть вызов сокращения в цикл for)) Я хотел бы знать.

Ответы [ 2 ]

28 голосов
/ 28 февраля 2012

Как сказано в связанной статье Гвидо, вы должны просто написать явный цикл for, если хотите избежать reduce(). Вы можете заменить линию

result = reduce(function, iterable, start)

от

result = start
for x in iterable:
    result = function(result, x)
3 голосов
/ 28 апреля 2017

Я хотел бы знать, есть ли подобная «более питоническая» альтернатива функции сокращения.

Да и нет.Это зависит от варианта использования.

В связанной статье Гвидо предлагает, чтобы большинство, но не все сокращения, записывались как циклы.Есть ограниченные обстоятельства, в которых он считает reduce применимым.

Так что, на мой взгляд, применимость метода limit () в значительной степени ограничена ассоциативными операторами, а во всех других случаях лучшеявным образом записать цикл накопления.

Не так много ассоциативных операторов.(Это операторы X, для которых (a X b) X c равняется X (b X c).) Я думаю, что это примерно ограничено +, *, &, |, ^, и ярлык и / или.

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