reduce()有什么问题?

81 投票
5 回答
24240 浏览
提问于 2025-04-11 09:24

网上关于Python 3.0中reduce()函数的变化,似乎引发了很多激烈的讨论,有人认为这个函数应该被去掉。我有点搞不懂为什么会这样;我觉得在很多情况下使用它是很合理的。如果大家的反感只是个人意见,我很难想象会有这么多人对此在意。

我错过了什么呢?reduce()函数到底有什么问题?

5 个回答

9

有人担心这会让编程变得晦涩难懂,做一些其实可以用更简单的方法来完成的事情。

我并不是反对使用 reduce,我有时候也觉得它是个很有用的工具。

39

reduce() 这个功能并没有被去掉,而是被移到了 functools 这个模块里。Guido 的想法是,除了像求和这样简单的情况,使用 reduce() 写的代码通常在用累加循环的方式写时会更清晰。

81

正如Guido在他的《Python 3000中的reduce()的命运》一文中所说:

现在说说reduce()。其实我一直最讨厌这个,因为除了少数涉及+或*的例子,几乎每次看到带有复杂函数参数的reduce()调用,我都得拿出纸和笔来画图,弄清楚到底传给那个函数的是什么,才能理解reduce()到底是干嘛的。所以在我看来,reduce()的适用范围基本上只限于那些可以结合的操作符,而在其他情况下,写出明确的累加循环会更好。

《函数式编程入门》这篇文章中,有一个很好的关于reduce的混淆例子:

快来看看,下面的代码在干嘛?

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

你可以弄明白,但要花时间理清这个表达式,搞清楚发生了什么。使用简短的嵌套定义会稍微好一些:

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()的功能会更清晰。

撰写回答