Python替代reduce()

Ada*_*kin 37 python functional-programming

有一个由Guido写自己半著名的文章暗示,reduce()应该去渡渡鸟的方式,离开了语言.它甚至被降级为Python 3中的顶级函数(而不是填入functools模块中).

对于许多其他功能性编程主食(地图等),可以使用常见的明确替代方案.例如,大多数时候a map()更好地写为列表理解.

我想知道的是,如果有一个类似的"更多pythonic"替代reduce函数.我有一些函数式编程背景(特别是ML),所以reduce()在考虑解决方案时常常会浮现在脑海中,但是如果有更好的方法来实现它们(没有将reduce调用展开到for循环中)我'我想知道.

Sve*_*ach 28

正如Guido的链接文章所说,如果你想避免,你应该只写一个明确的for循环reduce().你可以更换线路

result = reduce(function, iterable, start)
Run Code Online (Sandbox Code Playgroud)

通过

result = start
for x in iterable:
    result = function(result, x)
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,这不是100%等效 - 标准库中定义的`reduce()`不需要start参数.那么你必须在for循环周围设置一个保护来检查iterable是否为空,如果不是,则将第一项作为开始,并循环其余项.突然间,无论Guido认为什么,1行`reduce()`看起来更具吸引力.;) (12认同)
  • @AdamParkin:你的最后评论没有太多意义.这两个代码片段是100%等效的(出于实际目的).你*可以*在没有`start`参数的情况下调用`reduce()`,然后等价看起来会有所不同,但是你不需要特殊情况下的空迭代比你在使用`reduce()时需要的那样多.没有'开始'. (2认同)
  • `reduce(set.intersection, list_of_some_sets)` 将减少到 list_of_some_sets 中定义的所有集合的交集(它隐式地使用列表的第一个 elt 作为开始)。要将其展开到循环中,我必须提取第一个 elt(好吧,任何元素)并将其用作我的“开始”,然后进入循环遍历剩余的 n-1 个元素。但是,从列表中提取第一个(或其他)项目只有在您知道列表不为空时才有效,因此需要一个守卫。查看 [文档中的定义](http://docs.python.org/library/functions.html#reduce) 了解我的意思。 (2认同)

kku*_*ian 7

我想知道的是,是否有一个类似的“更 Pythonic”的替代 reduce 函数。

是和否。这取决于用例。

在链接的文章中,Guido 建议大多数但不是所有的减少都应该写成循环。他认为reduce适用的情况有限。

所以在我看来,reduce() 的适用性几乎仅限于关联运算符,在所有其他情况下,最好明确写出累加循环。

没有很多关联运算符。(那些是运算符 X,其中 (a X b) X c 等于 a X (b X c)。)我认为它仅限于 +、*、&、|、^ 和快捷方式和/或。