Python reduce()有什么问题?

Python reduce()有什么问题?,python,python-3.x,Python,Python 3.x,关于python 3.0中reduce()函数的更改以及如何删除,网络上似乎有很多热烈的讨论。我很难理解为什么会这样;我发现在各种情况下使用它是相当合理的。如果蔑视仅仅是主观的,我无法想象这么多人会关心它 我错过了什么?reduce()有什么问题?人们担心它会助长一种模糊的编程风格,用更清晰的方法可以完成一些事情 我并不反对reduce,我有时也觉得它是一个有用的工具。reduce()并没有被删除——它只是被移动到functools模块中。Guido的推理是,除了像求和这样的琐碎情况外,使用re

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


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

人们担心它会助长一种模糊的编程风格,用更清晰的方法可以完成一些事情

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

reduce()
并没有被删除——它只是被移动到
functools
模块中。Guido的推理是,除了像求和这样的琐碎情况外,使用
reduce()
编写的代码在作为累加循环编写时通常更清晰。

正如Guido在他的帖子中所说:

所以现在reduce()。这实际上是我最讨厌的一个,因为除了一些涉及+或*的示例外,几乎每次我看到带有非平凡函数参数的reduce()调用时,我都需要抓起纸笔来绘制实际输入到该函数中的内容,然后才能理解reduce()应该做什么。所以在我看来,reduce()的适用性非常局限于关联运算符,在所有其他情况下,最好显式写出累加循环

文章中有一个令人困惑的
reduce
的极好例子:

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

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)
在编写循环时,reduce()的许多用法更加清晰


reduce存在的主要原因是避免为带有累加器的循环编写显式for。尽管python有一些支持函数式风格的工具,但并不鼓励使用它。如果您喜欢“real”而不是“pythonic”函数式风格,请使用现代Lisp(Clojure?)或Haskell。

使用reduce和Horner方法计算多项式的值既紧凑又富有表现力

计算x处的多项式值。 a是多项式的系数数组

def poynomialValue(a,x):
   return reduce(lambda value, coef: value*x + coef, a)

Gah,这是一个可怕的推理:(是吗?Python的很多哲学都是关于编写清晰明了的代码。一个典型的reduce()调用通常需要我拿出一支铅笔,画出调用函数的内容。除非你能给我展示一个显着的性能提升(至少2倍),否则我会选择“清晰明了”“表达式的紧凑性”在任何一天都可以。在这种情况下,它可能更容易:sum(b表示a,b表示项)reduce代码并不等同于for循环。这里是等价的:
total=reduce(lambda total,(a,b):total+b,items,0)
“reduce函数可以混淆代码的意图。因此,reduce应该从语言中删除。“当然,我不知道有人会这么说,但这是不符合逻辑的。我想说的是,公平地说,在你的例子中加入一件羔羊犬就相当于把一件血迹斑斑的衬衫交给警察阵容中的一个人。我不会争辩这一点一开始并不令人困惑,但functools中的一切都是从你开始的。我发现functools在我学习使用它们的过程中越来越有用。现在,如果你想了解令人困惑的例子,请查看itertools()。我也在学习爱它们,但这是一次粗略的第一次约会。:-)论点是“让我们移动
reduce
,因为它可以用来编写不清楚的代码。”。好吧,
**
+
-
也可以。我们应该将它们移动到
functools
?这并不是真正试图回答OP的问题。“为什么
reduce
是个问题?”回答:“这是
reduce
的一个用例。”“。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-一个强大的语言工具总是可以用来提供简洁,但缺乏清晰度。我想给出一个例子,其中reduce可以用来紧凑地表示一个算法。请注意,这是一个没有关联的运营商的例子。这就像告诉华裔美国人,如果他们不喜欢在美国受到的待遇,就回中国去。我们在这里都是为了使广泛使用的语言变得更好。没有必要要求人们使用不同的语言。大多数情况下,由于软件包的可用性等限制,他们不能这样做。