Este dilema se puede resolver de diversas formas, pero nosotros te enseñamos la que en nuestra opinión es la solución más completa.
Solución:
Sí — usar math.nan
.
>>> from math import nan
>>> print(nan)
nan
>>> print(nan + 2)
nan
>>> nan == nan
False
>>> import math
>>> math.isnan(nan)
True
Antes de Python 3.5, se podía usar float("nan")
(insensible a mayúsculas y minúsculas).
Tenga en cuenta que verificar si dos cosas que son NaN son iguales entre sí siempre devolverá false. Esto se debe en parte a que no se puede decir (estrictamente hablando) que dos cosas que “no son un número” sean iguales entre sí; consulte ¿Cuál es la razón de ser de todas las comparaciones? false para valores IEEE754 NaN? para más detalles e información.
En su lugar, utilice math.isnan(...)
si necesita determinar si un valor es NaN o no.
Además, la semántica exacta de la ==
la operación en el valor de NaN puede causar problemas sutiles al intentar almacenar NaN dentro de tipos de contenedores como list
o dict
(o cuando se utilizan tipos de contenedores personalizados). Consulte Comprobación de la presencia de NaN en un contenedor para obtener más detalles.
También puedes construir números NaN usando el módulo decimal de Python:
>>> 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(...)
también funcionará con objetos decimales.
Sin embargo, usted no poder construye números NaN en el módulo de fracciones de Python:
>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
File "", line 1, in
File "C:Python35libfractions.py", line 146, in __new__
numerator)
ValueError: Invalid literal for Fraction: 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
File "", line 1, in
File "C:Python35libfractions.py", line 130, in __new__
value = Fraction.from_float(numerator)
File "C:Python35libfractions.py", line 214, in from_float
raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
ValueError: Cannot convert nan to Fraction.
Por cierto, también puedes hacer float('Inf')
, Decimal('Inf')
o math.inf
(3.5+) para asignar números infinitos. (Y también ver math.isinf(...)
)
Sin embargo haciendo Fraction('Inf')
o Fraction(float('inf'))
no está permitido y generará una excepción, al igual que NaN.
Si desea una forma rápida y fácil de verificar si un número no es ni NaN ni infinito, puede usar math.isfinite(...)
a partir de Python 3.2+.
Si desea realizar verificaciones similares con números complejos, el cmath
módulo contiene un conjunto similar de funciones y constantes como el math
módulo:
cmath.isnan(...)
cmath.isinf(...)
cmath.isfinite(...)
(Python 3.2+)cmath.nan
(Python 3.6+; equivalente acomplex(float('nan'), 0.0)
)cmath.nanj
(Python 3.6+; equivalente acomplex(0.0, float('nan'))
)cmath.inf
(Python 3.6+; equivalente acomplex(float('inf'), 0.0)
)cmath.infj
(Python 3.6+; equivalente acomplex(0.0, float('inf'))
)
nan = float('nan')
Y ahora tienes la constante, nan
.
De manera similar, puede crear valores NaN para decimal.Decimal.:
dnan = Decimal('nan')
Usar float("nan")
:
>>> float("nan")
nan