是的——使用math.nan。
>>> from math import nan
>>> print(nan)
nan
>>> print(nan + 2)
nan
>>> nan == nan
False
>>> import math
>>> math.isnan(nan)
True
在 Python 3.5 之前,可以使用 float("nan")(不区分大小写)。
请注意,检查是否为 NaN 的两个事物是否彼此相等将始终返回 false。这部分是因为“不是数字”的两件事不能(严格来说)说彼此相等——有关更多详细信息和信息,请参阅What is the rationale for all comparisons returning false for IEEE754 NaN values?。
如果您需要确定某个值是否为 NaN,请改用 math.isnan(...)。
此外,在尝试将 NaN 存储在 list 或 dict 等容器类型中(或使用自定义容器类型时)时,== 对 NaN 值的操作的确切语义可能会导致微妙的问题。详情请见Checking for NaN presence in a container。
您还可以使用 Python 的 decimal 模块构造 NaN 数:
>>> from decimal import Decimal
>>> b = Decimal('nan')
>>> print(b)
NaN
>>> print(repr(b))
Decimal('NaN')
>>>
>>> Decimal(float('nan'))
Decimal('NaN')
>>>
>>> import math
>>> math.isnan(b)
True
math.isnan(...) 也适用于 Decimal 对象。
但是,您不能在 Python 的 fractions 模块中构造 NaN 数:
>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python35\lib\fractions.py", line 146, in __new__
numerator)
ValueError: Invalid literal for Fraction: 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python35\lib\fractions.py", line 130, in __new__
value = Fraction.from_float(numerator)
File "C:\Python35\lib\fractions.py", line 214, in from_float
raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
ValueError: Cannot convert nan to Fraction.
顺便说一句,您还可以使用float('Inf')、Decimal('Inf') 或math.inf (3.5+) 来分配无限数。 (另见math.isinf(...))
但是,Fraction('Inf') 或 Fraction(float('inf')) 是不允许的,并且会抛出异常,就像 NaN 一样。
如果您想要一种快速简便的方法来检查一个数字是否既不是 NaN 也不是无限的,您可以使用 math.isfinite(...) 从 Python 3.2+ 开始。
如果您想对复数进行类似检查,cmath 模块包含一组与 math 模块类似的函数和常量: