reduce()有什么问题?

时间:2008-10-08 06:27:12

标签: python python-3.x

关于python 3.0中reduce()函数的更改以及如何删除它,网上似乎有很多激烈的讨论。我有点难以理解为什么会这样;我发现在各种情况下使用它是相当合理的。如果蔑视只是主观的,我无法想象会有这么多人关心它。

我错过了什么? reduce()有什么问题?

5 个答案:

答案 0 :(得分:66)

正如Guido在The fate of reduce() in Python 3000帖子中所说:

  

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

Functional Programming HOWTO文章中有一个令人困惑reduce的好例子:

  

快,以下代码在做什么?

total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
     

你可以解决这个问题,但要解开表达方式需要时间   这是怎么回事。使用简短的嵌套def语句可以使事情变得更好:

def combine (a, b):
    return 0, a[1] + b[1]

total = reduce(combine, items)[1]
     

但如果我只使用for循环那将是最好的:

total = 0
for a, b in items:
    total += b
     

或者内置的sum()和生成器表达式:

total = sum(b for a,b in items)
     

当写为for循环时,reduce()的许多用法都更清晰。

答案 1 :(得分:34)

reduce()未被移除 - 它只是被移动到functools模块中。 Guido的推理是,除了像求和之类的简单案例之外,使用reduce()编写的代码在写为累积循环时通常更清晰。

答案 2 :(得分:8)

人们担心它会鼓励一种混淆的编程风格,做一些可以用更清晰的方法实现的东西。

我并不反对减少自己,我有时也发现它是一种有用的工具。

答案 3 :(得分:2)

减少存在的主要原因是避免使用累加器为循环编写显式。即使python有一些支持功能风格的设施,也不鼓励它。如果您喜欢'真实'而不是'pythonic'功能样式 - 请使用现代Lisp(Clojure?)或Haskel。

答案 4 :(得分:-1)

使用霍纳方法通过减少来计算多项式的值既紧凑又富有表现力。

计算x处的多项式值。 a是多项式系数的数组

def poynomialValue(a,x):
   return reduce(lambda value, coef: value*x + coef, a)