4

如果我有一个值,以及我想要乘以该值的附加术语列表:

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 上。谢谢!

4

3 回答 3

8

reduce是执行此 IMO 的最佳方法,但您不必使用 lambda;相反,您可以*直接使用运算符:

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

n现在是 240。有关更多信息,请参阅操作员模块的文档。

于 2010-10-01T21:37:31.817 回答
7

减少不是唯一的方法。你也可以把它写成一个简单的循环:

for term in terms:
    n *= term

我认为这比 using 更清楚reduce,尤其是当您考虑到许多 Python 程序员从未见过reduce,而且这个名字并不能向第一次看到它的人传达它的实际作用时。

Pythonic 并不意味着将所有内容都写成推导式或尽可能使用函数式风格。Python 是一种多范式语言,在适当的时候编写简单的命令式代码是 Pythonic。

Guido van Rossum 也不想reduce在 Python 中使用:

所以现在减少()。这实际上是我一直最讨厌的一个,因为除了一些涉及 + 或 * 的示例之外,几乎每次我看到带有非平凡函数参数的 reduce() 调用时,我都需要拿起笔和纸来在我理解 reduce() 应该做什么之前,先画出实际输入该函数的内容。所以在我看来,reduce() 的适用性几乎仅限于关联运算符,在所有其他情况下,最好明确地写出累积循环。

没有很多关联运算符。(这些是运算符 X,其中 (a X b) X c 等于 a X (b X c)。)我认为它仅限于 +、*、&、|、^ 和快捷方式和/或。我们已经有了 sum(); 我很乐意将 reduce() 换成 product(),这样就可以处理两个最常见的用途。[...]

在 Python 3 中,reduce 已移至functools模块。

于 2010-10-01T21:37:22.207 回答
2

还有一种方式:

import operator
n = reduce(operator.mul, terms, n)
于 2010-10-01T21:40:28.720 回答