Должен ли эта функция использовать уменьшение () или есть еще более питоновый способ?

StackOverflow https://stackoverflow.com/questions/3843188

Вопрос

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

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. Спасибо!

Это было полезно?

Решение

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

for term in terms:
    n *= term

Я думаю, что это гораздо более понятно, чем использование reduce, особенно когда вы считаете, что многие программисты Python никогда не видели reduce И название мало что донесет до людей, которые видят это в первый раз, что он на самом деле делает.

Питонец не означает Напишите все как должное или Всегда используйте функциональный стиль, если это возможно. Отказ Python - это мультипарадигма языка и пишут простым императивным кодом при необходимости, является пифитоном.

Гвидо Ван Россом также не хочет reduce в Python:

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

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

В Python 3 Увеличение было перемещено в functools модуль.

Другие советы

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

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

n сейчас 240. Смотрите документы для Модуль оператора для получения дополнительной информации.

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

import operator
n = reduce(operator.mul, terms, n)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top