繁体   English   中英

Python 3.8 中的新方法 int.as_integer_ratio() 的目的是什么

[英]What's the purpose of the new method int.as_integer_ratio() in Python 3.8

我正在查看在 python 3.8 中实现的新功能,我发现了一个新的 function numerator, denominator = x.as_integer_ratio() 他们 state 在它的文档中

返回一对整数,其比率完全等于原始 integer 并且分母为正。 整数(整数)的 integer 比率始终以 integer 作为分子,1 作为分母。

基本上这段代码

x = 10
numerator, denominator = x.as_integer_ratio()

print(numerator)
print(denominator)

Output

10
1

我只是想知道拥有一个总是返回相同值和 1 的 function 有什么意义? 我还看到它以前可用于float ,这是有道理的。

文档

这个次要的 API 扩展使得编写分子、分母 = x.as_integer_ratio() 并使其适用于多种数字类型成为可能。

此方法已在多种类型上可用,例如float 现在使用此方法的代码适用于更多类型。 在鸭子打字下归档。

更改的主要原因似乎是为了实现统一性,并为 mypy 键入,因此int可以是float的子类型

msg313780 - (查看) 作者:Raymond Hettinger (rhettinger) * (Python committer) 日期:2018-03-13 21:25

目标:通过使浮点/十进制方法也可用于整数,使 int() 与浮点的互操作性更强。 这将使 mypy 将整数视为浮点数的子类型。

请参阅: https://mail.python.org/pipermail/python-dev/2018-March/152384.html

开放式问题:fractions.Fraction 和 numbers.Rational 也需要这样吗?

并深入研究 pipermail,它似乎有助于通过分解等方式更改类型的域:

[Python-Dev] 对称 arguments 用于 API 扩展 Guido van Rossum guido 在 python.org Tue Mar 13 15:07:15 EDT 20

 Previous message (by thread): [Python-Dev] Symmetry arguments for API expansion Next message (by thread): [Python-Dev] Symmetry arguments for API expansion Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

好的,请这样。

2018 年 3 月 13 日星期二上午 11:39,Raymond Hettinger < raymond.hettinger at gmail.com> 写道:

2018 年 3 月 13 日上午 10:43,Guido van Rossum 写道:

因此,让我们将 as_integer_ratio() 设为“如何从不实现 numbers.Rational 的数字中生成分数”的标准协议。 我们已经有两个例子(浮点数和十进制),也许 numpy 或有时提出的固定宽度十进制类型也可以从中受益。 如果这意味着我们应该将它添加到 int 中,那对我来说很好。

我想要这样的结果。

签名 x.as_integer_ratio() -> (int, int) 使用起来很愉快。 output 很容易解释,并且分母与 2 或 10 的幂无关。 由于 Python 整数是精确且无界的,因此无需担心范围或舍入问题。

相比之下, math.freexp(float) ->(float, int) 有点痛苦,因为它仍然让你处于浮点域中,而不是让你分解为更基本的类型。 很高兴有一种方法可以将链从ℚ、ℝ或ℂ向下移动到更基本的ℤ(当然,这只是因为浮点数和复数以排除精确无理数的方式实现)。

雷蒙德

看:

考虑一个 function,它接受一个参数并将其作为分数进行操作:

def foo(x):
    # ...
    num, denom = x.as_integer_ratio()
    # ...

在 3.8 之前,我们只能用浮点数调用它:

foo(3.14)

但现在我们可以用 int 调用它并获得可靠的行为:

foo(42)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM