77

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

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

4

5 回答 5

77

正如 Guido 在他的 Python 3000 中 reduce() 的命运帖子中所说:

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

reduce函数式编程 HOWTO文章中有一个很好的混淆示例:

快,下面的代码在做什么?

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() 的许多用法更加清晰。

于 2008-10-08T07:42:12.293 回答
36

reduce()没有被删除——它只是被移动到functools模块中。Guido 的推理是,除了像求和这样的琐碎情况外,使用 编写的代码reduce()通常在编写为累加循环时会更清晰。

于 2008-10-08T07:20:43.803 回答
9

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

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

于 2008-10-08T06:53:54.417 回答
4

reduce 存在的主要原因是避免使用累加器编写显式的 for 循环。尽管 python 有一些支持函数式风格的工具,但不鼓励这样做。如果你喜欢“真实的”而不是“pythonic”的函数式风格——请改用现代的 Lisp(Clojure?)或 Haskell。

于 2017-05-16T05:15:37.503 回答
-2

通过 Horner 方法使用 reduce 计算多项式的值既紧凑又富有表现力。

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

def poynomialValue(a,x):
   return reduce(lambda value, coef: value*x + coef, a)
于 2020-12-08T15:59:07.443 回答