【问题标题】:Does this function have to use reduce() or is there a more pythonic way?这个函数必须使用 reduce() 还是有更 Pythonic 的方式?
【发布时间】:2011-04-20 01:57:47
【问题描述】:

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

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

【问题讨论】:

标签: python list-comprehension reduce


【解决方案1】:

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

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

n 现在是 240。有关更多信息,请参阅operator module 的文档。

【讨论】:

    【解决方案2】:

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

    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 等于 a X (b X c)。)我认为它仅限于 +、*、&、|、^ 和快捷方式和/或。我们已经有了 sum();我很乐意将 reduce() 换成 product(),这样就可以处理两个最常见的用途。 [...]

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

    【讨论】:

    • 我的想法完全正确,只是快了一分钟!
    • 我认为“pythonic”的意思是“将所有内容写在一行中”
    • 嗯,他添加了any()all()(他在引用之后的下一段中提出),但从未添加product()。不管reduce 的最终命运如何(而且我在阅读它时从来没有遇到任何问题),n *= product(terms) 非常清楚。我认为在循环或reduce调用之间做出决定,或者其他什么比把它放在一个有名的函数中更重要。
    • Falmarri:不,你在考虑 APLic!
    • 我反对这一点。如果您期望人们无法阅读您的代码,那么就没有编写代码的好方法。我承认 python 社区不是很喜欢函数式编程,但是 reduce 就是这么简单明了。就可读性而言,无论如何都不逊于 for 循环。
    【解决方案3】:

    另一种方式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      相关资源
      最近更新 更多