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

big*_*jim 4 python reduce list-comprehension

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

n = 10
terms = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

是否可以使用列表推导来执行以下操作:

n *= (term for term in terms) #not working...
Run Code Online (Sandbox Code Playgroud)

或者是唯一的方法:

n *= reduce(lambda x,y: x*y, terms)
Run Code Online (Sandbox Code Playgroud)

这是在Python 2.6.2上.谢谢!

Sas*_*gov 8

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

import operator
n *= reduce(operator.mul, terms)
Run Code Online (Sandbox Code Playgroud)

n现在是240.有关详细信息,请参阅运算符模块的文档.


Mar*_*ers 7

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

for term in terms:
    n *= term
Run Code Online (Sandbox Code Playgroud)

我认为这比使用要清楚得多reduce,特别是当你考虑到许多Python程序员从未见过时reduce,这个名字几乎没有传达给那些第一次看到它实际上做的人.

Pythonic并不意味着把所有东西都写成理解,或者如果可能的话总是使用功能样式.Python是一种多范式语言,在适当的时候编写简单的命令式代码是Pythonic.

Guido van Rossum也不想要reducePython:

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

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

在Python 3中,reduce已经移到了functools模块中.

  • 嗯,他添加了`any()`和`all()`(他在引用之后的下一段中提出),但从未添加过`product()`.无论"减少"的最终命运如何(我从来没有遇到任何麻烦),`n*= product(terms)`非常清楚.我认为在一个循环或一个reduce调用之间做出决定,或者把它放在一个名字很好的函数中. (3认同)