Python 3000 中的 reduce() 的命运 作者 Guido van van Rossum
大约 12 年前,Python 获得了 lambda、reduce()、filter() 和 map(),这是由(我相信)一位 Lisp 黑客提供的,他错过了它们并提交了工作补丁。但是,尽管有 PR 值,我认为这些功能应该从 Python 3000 中删除。
更新:lambda、filter 和 map 将保留(后两者有小的变化,返回迭代器而不是列表)。只有 reduce 会从 3.0 标准库中移除。您可以从 functools 导入它。
我认为删除 filter() 和 map() 是没有争议的;filter(P, S) 几乎总是更清楚地写成 [x for x in S if P(x)],这有一个巨大的优势,即最常见的用法涉及比较谓词,例如 x==42,并定义一个 lambda 只需要读者付出更多的努力(而且 lambda 比列表理解慢)。对于 map(F, S) 更是如此,它变成了 [F(x) for x in S]。当然,在许多情况下,您可以改用生成器表达式。
为什么要放弃 lambda?大多数 Python 用户不熟悉 Lisp 或 Scheme,因此名称令人困惑;此外,人们普遍误解 lambda 可以做嵌套函数不能做的事情——我仍然记得 Laura Creighton 的 Aha!-erlebnis 在我向她展示没有区别之后!即使有一个更好的名字,我认为并排两个选择只需要程序员考虑做出与他们的程序无关的选择;没有选择会简化思考过程。此外,一旦 map()、filter() 和 reduce() 消失了,就没有很多地方需要编写非常短的本地函数了;我想到了 Tkinter 回调,但我发现回调通常应该是一些带有状态的对象的方法(玩具程序除外)。
所以现在减少()。这实际上是我一直最讨厌的一个,因为除了几个涉及 + 或 * 的例子,几乎每次我看到带有非平凡函数参数的 reduce() 调用时,我都需要拿起笔和纸在我理解 reduce() 应该做什么之前,绘制出实际输入该函数的内容。所以在我看来,reduce() 的适用性几乎仅限于关联运算符,在所有其他情况下,最好明确写出累加循环。
没有很多关联运算符。(那些是运算符 X,其中 (a X b) X c 等于 a X (b X c)。)我认为它仅限于 +、*、&、|、^ 和快捷方式和/或。我们已经有了 sum();?我很乐意将 reduce() 换成 product(),这样就可以处理两个最常见的用途。按位运算符相当专业,如果需要,我们可以将快速版本放在库模块中;对于快捷布尔值,我有以下建议。
让我们将 any() 和 all() 添加到标准内置函数中,定义如下(但实现更有效):
定义任何(S):
对于 S 中的 x:
如果 x:
返回真
返回错误
全部定义(S):
对于 S 中的 x:
如果不是 x:
返回错误
最后
?? 硬核资料:关注即可领取 PPT 模板、简历模板、行业经典书籍 PDF。
?? 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
?? 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
**??
知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
评论