Уменьшить это не единственный способ. Вы также можете написать его в виде простого цикла:
for term in terms:
n *= term
Я думаю, что это гораздо понятнее, чем использование reduce
, особенно если учесть, что многие программисты на Python никогда не видели reduce
, а имя мало что дает людям, которые впервые видят его, что оно на самом деле делает .
Pythonic не означает писать все как понимание или всегда использовать функциональный стиль, если это возможно . Python - это мультипарадигмальный язык, и при необходимости пишется простой императивный код Pythonic.
Гидо ван Россум также не хочет reduce
в Python:
Так что теперь уменьшаем (). Это на самом деле тот, который я всегда ненавидел больше всего, потому что, за исключением нескольких примеров, включающих + или *, почти каждый раз, когда я вижу вызову redu () с нетривиальным аргументом функции, мне нужно взять ручку и бумагу, чтобы представьте диаграмму, что на самом деле подается в эту функцию, прежде чем я пойму, что должен делать redu (). Так что, на мой взгляд, применимость метода limit () в значительной степени ограничена ассоциативными операторами, и во всех других случаях лучше выписать цикл накопления явно.
Не так много ассоциативных операторов. (Это операторы X, для которых (a X b) X c равно a X (b X c).) Я думаю, что это примерно ограничено +, *, &, |, ^, и ярлык и / или. У нас уже есть сумма (); Я бы с радостью обменял метод limit () на product (), так что он позаботится о двух наиболее распространенных случаях использования. [...]
В Python 3 уменьшение было перенесено в модуль functools
.