Подтвердить что ты не робот

Альтернатива Python для уменьшения()

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

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

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

4b9b3361

Ответ 1

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

result = reduce(function, iterable, start)

по

result = start
for x in iterable:
    result = function(result, x)

Ответ 2

Я хотел бы знать, есть ли подобная "более питоновая" альтернатива функции уменьшения.

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

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

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

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