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