网上似乎有很多关于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()
在写为累积循环时通常更清晰.
人们担心它鼓励混淆的编程风格,做一些可以用更清晰的方法实现的东西.
我不反对减少自己,我也发现它有时候是一种有用的工具.