网上似乎有很多关于 python 3.0 中 reduce() 函数的更改以及应该如何删除它的讨论。我很难理解为什么会这样;我发现在各种情况下使用它是很合理的。如果轻视只是主观的,我无法想象这么多人会关心它。
我错过了什么?reduce() 有什么问题?
网上似乎有很多关于 python 3.0 中 reduce() 函数的更改以及应该如何删除它的讨论。我很难理解为什么会这样;我发现在各种情况下使用它是很合理的。如果轻视只是主观的,我无法想象这么多人会关心它。
我错过了什么?reduce() 有什么问题?
正如 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() 的许多用法更加清晰。
reduce()
没有被删除——它只是被移动到functools
模块中。Guido 的推理是,除了像求和这样的琐碎情况外,使用 编写的代码reduce()
通常在编写为累加循环时会更清晰。
人们担心它会鼓励一种混淆的编程风格,做一些可以用更清晰的方法来实现的事情。
我并不反对减少自己,有时我也发现它是一个有用的工具。
reduce 存在的主要原因是避免使用累加器编写显式的 for 循环。尽管 python 有一些支持函数式风格的工具,但不鼓励这样做。如果你喜欢“真实的”而不是“pythonic”的函数式风格——请改用现代的 Lisp(Clojure?)或 Haskell。
通过 Horner 方法使用 reduce 计算多项式的值既紧凑又富有表现力。
计算 x 处的多项式值。a 是多项式的系数数组
def poynomialValue(a,x):
return reduce(lambda value, coef: value*x + coef, a)