reduce()有什么问题?

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

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

正如Guido 在Python 3000中所说的reduce()的命运一样 :

所以现在reduce()。 这实际上是我一直最讨厌的一个,因为除了几个涉及+或*的例子之外,几乎每次我看到一个带有非平凡函数参数的reduce()调用时,我都需要抓笔和纸来在我明白了reduce()应该做什么之前,实际上正在input什么函数。 所以在我看来,reduce()的适用性几乎局限于关联​​运算符,而在所有其他情况下,最好明确地写出累加循环。

function编程HOWTO文章中有一个令人困惑的reduce例子:

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

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

你可以把它弄清楚,但是需要花时间来分解expression式来弄清楚发生了什么。 使用简短的嵌套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()和一个生成器expression式:

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

reduce()的许多用法在编写for循环时会更清晰。

reduce()不会被删除 – 它只是被移动到functools模块中。 Guido的推理是,除了summation这样的小事例外,使用reduce()编写的代码在写成累积循环时通常会更清晰。

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

我不反对减less自己,有时我也觉得它是一个有用的工具。

减less存在的主要原因是为了避免用累加器写明显的循环。 尽pipepython有一些设施来支持function风格,但并不鼓励。 如果你喜欢“真实的”而不是“pythonic”的function风格,那就用现代的Lisp(Clojure?)或者Haskel。