Должна ли эта функция использовать Redu () или есть более питонический способ? - PullRequest
4 голосов
/ 02 октября 2010

Если у меня есть значение и список дополнительных терминов, которые я хочу умножить на значение:

n = 10
terms = [1,2,3,4]

Можно ли использовать понимание списка, чтобы сделать что-то вроде этого:

n *= (term for term in terms) #not working...

Или это единственный способ:

n *= reduce(lambda x,y: x*y, terms)

Это на Python 2.6.2. Спасибо!

Ответы [ 3 ]

8 голосов
/ 02 октября 2010

reduce - лучший способ сделать это ИМО, но вам не нужно использовать лямбду; вместо этого вы можете напрямую использовать оператор *:

import operator
n *= reduce(operator.mul, terms)

n теперь составляет 240. Для получения дополнительной информации см. Документы для операторского модуля *1007*.

7 голосов
/ 02 октября 2010

Уменьшить это не единственный способ. Вы также можете написать его в виде простого цикла:

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.

2 голосов
/ 02 октября 2010

Еще один способ:

import operator
n = reduce(operator.mul, terms, n)
...