Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 239 – 为 Python 添加有理数类型

作者:
Christopher A. Craig <python-pep at ccraig.org>, Moshe Zadka <moshez at zadka.site.co.il>
状态:
已拒绝
类型:
标准跟踪
创建日期:
2001年3月11日
Python 版本:
2.2
发布历史:
2001年3月16日

目录

Warning

本 PEP 已被拒绝。

×

在原理部分概述的需求已在一定程度上通过接受 PEP 327 用于十进制算术得到解决。Guido 也指出,“有理数算术是 ABC 中默认的‘精确’算术,但结果不如预期”。请参阅 2005 年 6 月 17 日的 python-dev 讨论 [1]

后记: 随着 PEP 3141,“数字类型层次结构”的接受,一个名为“Rational”的抽象基类已被添加,并在“fractions”模块中提供了具体实现。

摘要

Python 没有具有无限精确有理数语义的数字类型。本提案解释了这种类型的语义,并建议了支持这种类型的内置函数和字面量。本 PEP 不建议有理数的字面量;这留待另一个 PEP

基本原理

尽管有时速度较慢且更占用内存(通常是无限的),有理数算术更接近数学上理想的数字概念,并且其行为对新手来说更不容易产生意外。尽管已经编写了许多 Python 有理数实现,但这些都没有存在于核心中,也没有以任何方式进行文档化。这使得它们对不太熟悉 Python 的人来说更难访问。

有理数类型

将添加一个名为 RationalType 的新数字类型。其一元运算符将执行显而易见的操作。二元运算符将整数和长整数强制转换为有理数,并将有理数强制转换为浮点数和复数。

将支持以下属性:.numerator.denominator。语言定义将保证:

r.denominator * r == r.numerator

分子和分母的最大公约数为 1 且分母为正。

方法 r.trim(max_denominator) 将返回最接近 r 的有理数 s,使得 abs(s.denominator) <= max_denominator

rational() 内置函数

此函数将具有签名 rational(n, d=1)nd 都必须是整数、长整数或有理数。做出以下保证:

rational(n, d) * d == n

未解决的问题

  • 也许类型应该叫做 rat 而不是 rational。有人建议我们有“抽象”的纯数学类型,命名为 complex、real、rational、integer,以及具有 float、rat、long、int 等名称的“具体”表示类型。
  • 具有整数值的有理数是否应允许作为序列索引?例如,s[5/3 - 2/3] 是否应等同于 s[1]
  • 有理数是否允许使用 shiftmask 运算符?对于具有整数值的有理数呢?
  • Marcin 'Qrczak' Kowalczyk 在 c.l.py 上很好地总结了将整数与有理数统一的论点。

    统一整数与有理数的论点

    • 由于 2 == 2/1 并且可能 str(2/1) == '2',它减少了对象看起来相等但行为不同的意外情况。
    • 当我知道没有余数时(如果我错了有余数,则后面可能会出现异常),/ 可以自由用于整数除法。

    反对意见

    • 当我将 / 的结果用作序列索引时,通常是一个错误,不应该通过使程序对某些数据工作而对其他数据中断来隐藏。
    • (这假设统一后 int 和 rational 将是不同的类型:)类型很少应依赖于值。当已知变量类型时,推理更容易:我知道如何使用它。我可以确定某个东西是 int,并期望在此处使用的其他对象也将是 int。
    • (这假设它们是相同的类型:)int 本身是一个很好的类型,不应与有理数混淆。某个东西是整数的事实应该可以作为对其类型的声明来表达。许多操作需要 int 并且不接受有理数。将它们视为不同的类型是很自然的。

参考资料


来源: https://github.com/python/peps/blob/main/peps/pep-0239.rst

最后修改: 2025-02-01 08:50:23 GMT