是的-使用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。部分原因是不能(严格地说)说两个不是数字的东西彼此相等-请参阅所有比较为IEEE754 NaN值返回false的基本原理是什么?了解更多详细信息。
相反,math.isnan(...)
如果需要确定某个值是否为NaN ,请使用。
此外,==
在尝试将NaN存储在诸如list
或dict
(或使用自定义容器类型)的容器类型中时,对NaN值进行操作的确切语义可能会引起细微问题。有关更多详细信息,请参见检查容器中是否存在NaN。
您还可以使用Python的十进制模块构造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的分数模块中构造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
: