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