PEP 211 – 添加新的外部产品操作员

猫勺猫勺 05-01 4.53 W 阅读

警告

PEP 已被拒绝。

×

后来的 PEP 465 中的方法最终被接受 代替这个 PEP。该 PEP 的被拒绝的想法更详细地解释了基本原理。

介绍

该 PEP 描述了定义(发音为“across”)的提案 作为 Python 2.2 中的新外积运算符。当应用于 序列(或其他可迭代对象),此运算符将组合 它们的迭代器,以便:@

for (i, j) in S @ T:
    pass

将等同于:

for i in S:
    for j in T:
        pass

类将能够使用特殊的 方法 、 和 。在 特别是,新的数字模块PEP 209) 将使 用于实现矩阵的多维数组的运算符 乘法。__across____racross____iacross__

背景

数字运算现在只是计算的一小部分,但很多 程序员(包括许多 Python 用户)仍然需要 在代码中表达复杂的数学运算。最数值 语言,例如 APL、Fortran-90、MATLAB、IDL 和 Mathematica, 因此提供两种形式的常用算术运算符。 一种形式可以逐个元素地工作,例如乘以相应的 其矩阵参数的元素。另一个实现 该操作的“数学”定义,例如执行 行列矩阵乘法。

Zhu 和 Lielens 提议将 Python 的运算符增加一倍 这边。他们的提议将创建六个新的二进制中缀 操作员,以及 6 个新的就地操作员。

该提案的原始版本要保守得多。 作者咨询了 GNU Octave [1] 的开发人员,一个开放的 MATLAB的源克隆。其开发人员同意提供 矩阵乘法的中缀运算符很重要:数值 程序员确实在乎他们是否必须编写而不是 .mmul(A,B)A op B

另一方面,当被问及中缀有多重要时 矩阵解和其他运算符,James教授 罗林斯回答说:

我不认为这是必须的,而且我做了很多矩阵 倒置。我不记得它是否总是如此 改为写。我建议放弃.A\bb\AInv(A)*b\

基于这次讨论,以及美国学生的反馈 国家实验室和其他地方,我们建议只添加 一个新运算符,用于矩阵乘法,到 Python。

迭代器

计划在 Python 2.2 中添加迭代器开辟了更广泛的领域 本提案的范围。作为 PEP 201 讨论的一部分, 锁步迭代,该提案的作者进行了 非正式可用性实验[3]。结果显示,用户 在心理上接受“跨乘积”循环语法。为 例如,大多数用户期望:

S = [10, 20, 30]
T = [1, 2, 3]
for x in S; y in T:
    print x+y,

打印 .我们相信用户会 对以下方面有相同的反应:11 12 13 21 22 23 31 32 33

for (x, y) in S @ T:
    print x+y

也就是说,他们会自然而然地将此解释为一种整洁的方式 写入循环嵌套。

这就是迭代器的用武之地。实际构建 在执行循环之前,两个(或多个)序列的叉积 会非常昂贵。另一方面,可以定义 获取其参数的迭代器,然后创建一个外部迭代器 它返回内部返回的值的元组 迭代器。@

讨论

  1. 添加命名函数“across”对以下方面的影响较小 Python 比新的中缀运算符。但是,这不会使 Python 对数字程序员更具吸引力,他们确实这样做 关心他们是否可以使用 运算符,或者他们是否必须将其编写为函数调用。

  2. @可以以与比较相同的方式链接 运算符,即:

  3. (1, 2) @ (3, 4) @ (5, 6)

    将不得不返回,而不是.这不应该要求特殊 支持解析器,作为由 首先可以很容易地教你如何将自己与 普通迭代器。(1, 3, 5) ... (2, 4, 6)((1, 3), 5) ... ((2, 4), 6)@

  4. 必须有某种方法来区分可重启 无法重新启动的迭代器。例如 如果是一个输入流(例如文件),并且是一个列表,那么很简单,但不是,因为迭代 通过流不能重复。这可以治疗 作为错误,或者通过让外部迭代器检测 不可重启的内部迭代器并缓存其值。SLS @ LL @ S

  5. 在三位新手面前对这个提案进行白板测试 Python 用户(都是有经验的程序员)表示 用户将期望:

  6. "ab" @ "cd"

    返回四个字符串,而不是四个元组对 字符。在以下方面意见不一:

("a", "b") @ "cd"

应该回来...

选择

  1. 什么都不做 — 保持 Python 简单。

    这始终是默认选项。

  2. 添加命名函数而不是运算符。

    Python 主要不是一种数字语言;它可能不值得 针对这种特殊情况对其进行复杂化处理。但是,支持真正的 矩阵乘法经常被要求,并且建议 内置序列类型的语义将简化 表达一个非常常见的成语(嵌套循环)。@

  3. 引入所有现有运算符的前缀形式,例如 和 ,如 PEP 225 中建议的那样。~*~+

    我们对此的反对意见是,没有足够的需求来 证明额外的复杂性是合理的(参见Rawlings的评论[2]), 并且所提出的语法不符合“低碳粉”的可读性 测试。

确认

感谢朱怀宇发起这次讨论,并感谢 詹姆斯·罗林斯(James Rawlings)和学生在各种Python课程中为他们的 讨论数值程序员真正关心的是什么。


The End 微信扫一扫

文章声明:以上内容(如有图片或视频在内)除非注明,否则均为腾龙猫勺儿原创文章,转载或复制请以超链接形式并注明出处。

本文作者:猫勺本文链接:https://www.jo6.cn/post/94.html

上一篇 下一篇

相关阅读

取消
微信二维码
微信二维码
支付宝二维码