【问题标题】:Why aren't Inf, -Inf and NaN keywords in Python?为什么 Python 中没有 Inf、-Inf 和 NaN 关键字?
【发布时间】:2019-04-06 11:02:58
【问题描述】:

PEP 754的拒绝通知中声明:

此 PEP 已被拒绝。开业四年后, 未能引起足够的社区兴趣。

这个 PEP 的几个想法是在 Python 2.6 中实现的。 float('inf') 和 repr(float('inf')) 现在保证可以工作 每个支持的平台都具有 IEEE 754 语义。但是,那 eval(repr(float('inf'))) 往返仍然不受支持,除非您 自己定义 inf 和 nan:

>>> inf = float('inf')
>>> inf, 1E400
(inf, inf)
>>> neginf = float('-inf')
>>> neginf, -1E400
(-inf, -inf)
>>> nan = float('nan')
>>> nan, inf * 0.
(nan, nan)

这似乎是说Python中没有对Inf,NaN和-Inf的原生支持,并且提供的示例是准确的!但是,它是不必要的冗长:

$ python2.7
>>> 1e400
inf
>>> 1e400 * 0
nan
>>> -1e400 * 0
nan
>>> -1e400
-inf
$ python3
>>> 1e400
inf
>>> 1e400 * 0
nan
>>> -1e400 * 0
nan
>>> -1e400
-inf

这些是数字 1 * 10 ^ 400 的规范表示。默认情况下,语法中不存在名称 infnan,但如果它们存在于表示中,则为什么不是 infnan 关键字?

我不是在问为什么 PEP 被拒绝,因为那是基于意见的。

【问题讨论】:

  • Python 中有very few keywords。例如,float 不是关键字。当然floatinf 更普遍有用。那么为什么应该 inf 是关键字?
  • @Robᵩ floatint 恰好是既是类型又是函数的内置函数;他们很特别。如果存在,为什么不nan
  • 因为人们很少使用infnan,所以他们不保证成为关键字的状态?
  • @Nayuki 这是一个很好的观点,我猜 Python 没有过多的关键字 cough Perl 6
  • 事后添加关键字很难;有人可能会使用您建议的关键字作为变量名,而这种更改会破坏他们的代码。定义一个很少有人关心的常数值得冒险吗?

标签: python ieee-754


【解决方案1】:

我的猜测是没有人愿意不必要地弄乱命名空间。

如果你想做数学,你仍然可以:

import math

print(math.inf)
print(-math.inf)
print(math.nan)

输出:

inf
-inf
nan

【讨论】:

  • 但是输出不是打印的字符串,这是我在问题中显示的——它们是原生支持的,但不是关键字。
  • 定义“本机支持”。 repr 调用返回的值不一定对 Python 有任何特殊的内部含义。例如,"nan" 是在 repr 完成执行前不久通过普通的strcopy call 创建的。
【解决方案2】:

你可以使用

float('inf')

np.nan

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2014-05-03
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多