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。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
**🍅

新中。

**🍅

[外链图片转存中…(img-AYw0AZd8-1647834450403)]

知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值