这个函数是否必须使用reduce()或者是否有更多的pythonic方式?

时间:2010-10-01 21:33:28

标签: python list-comprehension reduce

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

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 个答案:

答案 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)