reduce()有什么问题?

jer*_*emy 65 python python-3.x

网上似乎有很多关于python 3.0中reduce()函数更改以及如何删除它的讨论.我有点难以理解为什么会这样; 我发现在各种情况下使用它是相当合理的.如果蔑视只是主观的,我无法想象会有这么多人关心它.

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

Dzi*_*inX 68

正如Guido所说,他在Python 3000帖子中的reduce()的命运:

所以现在减少().这实际上是我一直非常讨厌的那个,因为除了几个涉及+或*的例子之外,几乎每当我看到一个带有非平凡函数参数的reduce()调用时,我都需要抓笔和纸来在我理解reduce()应该做什么之前,图表实际上被输入到该函数中的是什么.所以在我看来,reduce()的适用性几乎仅限于关联运算符,在所有其他情况下,最好明确地写出累积循环.

这里是一个令人困惑的一个很好的例子reduce的函数式编程HOWTO文章:

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

total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
Run Code Online (Sandbox Code Playgroud)

你可以搞清楚,但是需要时间来解开表达式来弄清楚发生了什么.使用简短的嵌套def语句可以使事情变得更好:

def combine (a, b):
    return 0, a[1] + b[1]

total = reduce(combine, items)[1]
Run Code Online (Sandbox Code Playgroud)

但如果我只使用for循环,那将是最好的:

total = 0
for a, b in items:
    total += b
Run Code Online (Sandbox Code Playgroud)

或者sum()内置和生成器表达式:

total = sum(b for a,b in items)
Run Code Online (Sandbox Code Playgroud)

当写为for循环时,reduce()的许多用法都更清晰.

  • reduce代码不等同于for循环.这是等价的:`total = reduce(lambda total,(a,b):total + b,items,0)` (24认同)
  • 在这种情况下,它可能更容易:总和(b表示a,b表示项目) (4认同)
  • "reduce函数可以模糊代码的意图.因此,应该从语言中删除reduce." 当然,我不知道有人这么说,但它*是一个不合理的. (3认同)
  • 参数是"让我们移动`reduce`,因为它可以用来编写不清楚的代码." 那么,`**`,`+`和`-`也可以.我们应该将它们移到`functools`吗? (3认同)
  • 要点,但公平地说,将lambda折腾到你的榜样中相当于将一件血迹斑斑的衬衫交给警察阵容中的一个人.我不会认为reduce()最初并不令人困惑,但functools中的所有内容都是在你开始的时候.当我学会使用functools时,我发现functools越来越有用.现在,如果你想要混淆的例子,请查看itertools().我也在学习爱他们,但这是一个艰难的第一次约会.:-) (2认同)

Joh*_*kin 35

reduce()没有删除 - 它只是被移动到functools模块中.Guido的推理是,除了像求和这样的简单案例之外,使用的代码reduce()在写为累积循环时通常更清晰.

  • 嘎,这是可怕的推理:( (30认同)
  • 除非你能告诉我一个*显着的*性能提升(至少2倍),否则任何一天我都会对"紧凑的表达"采取"明确而明显的". (28认同)
  • 是吗?Python的大部分理念是编写清晰明了的代码.对reduce()的典型调用通常要求我打破铅笔并绘制调用函数的图形. (22认同)

Eli*_*sky 8

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

我不反对减少自己,我也发现它有时候是一种有用的工具.