如果我有一个值,并且我想要的附加术语列表乘以值:
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上。谢谢!
答案 0 :(得分:8)
reduce
是执行此IMO的最佳方式,但您不必使用lambda;相反,您可以直接使用*
运算符:
import operator
n *= reduce(operator.mul, terms)
n
现在为240.有关详细信息,请参阅operator module的文档。
答案 1 :(得分:7)
减少不是唯一的方法。你也可以把它写成一个简单的循环:
for term in terms:
n *= term
我认为这比使用reduce
要清楚得多,尤其是当您考虑到许多Python程序员从未见过reduce
时,该名称几乎无法传达给第一次看到它的人实际上是做什么的。
Pythonic并不意味着写出所有内容,因为理解或总是使用功能样式(如果可能)。 Python是一种多范式语言,在适当的时候编写简单的命令式代码是Pythonic。
Guido van Rossum也不希望在Python中使用reduce
:
所以现在减少()。这实际上是我一直非常讨厌的那个,因为除了几个涉及+或*的例子之外,几乎每当我看到一个带有非平凡函数参数的reduce()调用时,我都需要抓笔和纸来在我理解reduce()应该做什么之前,图表实际上被输入到该函数中的是什么。所以在我看来,reduce()的适用性几乎局限于关联运算符,在所有其他情况下,最好明确地写出累积循环。
没有很多关联运算符。 (那些是运算符X,其中(a X b)X c等于X(b X c)。)我认为它仅限于+,*,&,|,^和快捷方式和/或。我们已经有了sum();我很乐意为product()交易reduce(),以便处理两个最常见的用途。 [...]
在Python 3中,reduce已移至functools
模块。
答案 2 :(得分:2)
另一种方式:
import operator
n = reduce(operator.mul, terms, n)