La plupart des langages ont une constante NaN que vous pouvez utiliser pour attribuer une variable la valeur NaN. Python peut-il le faire sans utiliser numpy?
Réponses
Trop de publicités?Oui -- utilisez math.nan
.
>>> from math import nan
>>> print(nan)
nan
>>> print(nan + 2)
nan
>>> nan == nan
False
>>> import math
>>> math.isnan(nan)
True
Avant Python 3.5, on pouvait utiliser float("nan")
(insensible à la casse).
Notez que vérifier si deux choses qui sont NaN sont égales l'une à l'autre renverra toujours faux. Cela est en partie dû au fait que deux choses qui ne sont "pas un nombre" ne peuvent pas (strictement parlant) être dites égales l'une à l'autre -- voir Quelle est la raison pour laquelle toutes les comparaisons renvoient faux pour les valeurs NaN IEEE754 ? pour plus de détails et d'informations.
Utilisez plutôt math.isnan(...)
si vous devez déterminer si une valeur est NaN ou non.
De plus, les sémantiques exactes de l'opération ==
sur la valeur NaN peuvent entraîner des problèmes subtils lors de la tentative de stockage de NaN à l'intérieur de types de conteneurs tels que list
ou dict
(ou lors de l'utilisation de types de conteneurs personnalisés). Voir Vérification de la présence de NaN dans un conteneur pour plus de détails.
Vous pouvez également construire des nombres NaN en utilisant le module 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(...)
fonctionnera également avec les objets Decimal.
Cependant, vous ne pouvez pas construire des nombres NaN dans le module fractions de Python :
>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
File "", line 1, in
File "C:\Python35\lib\fractions.py", line 146, in __new__
numerator)
ValueError: Litéral invalide pour Fraction : 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
File "", line 1, in
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("Impossible de convertir %r en %s." % (f, cls.__name__))
ValueError: Impossible de convertir nan en Fraction.
Accessoirement, vous pouvez également faire float('Inf')
, Decimal('Inf')
, ou math.inf
(3.5+) pour assigner des nombres infinis. (Et voir aussi math.isinf(...)
)
Cependant, faire Fraction('Inf')
ou Fraction(float('inf'))
n'est pas autorisé et va déclencher une exception, tout comme NaN.
Si vous voulez un moyen rapide et facile de vérifier si un nombre n'est ni NaN ni infini, vous pouvez utiliser math.isfinite(...)
à partir de Python 3.2+.
Si vous voulez effectuer des vérifications similaires avec des nombres complexes, le module cmath
contient un ensemble similaire de fonctions et constantes que le module math
:
cmath.isnan(...)
cmath.isinf(...)
cmath.isfinite(...)
(Python 3.2+)cmath.nan
(Python 3.6+; équivalent àcomplexe(float('nan'), 0.0)
)cmath.nanj
(Python 3.6+; équivalent àcomplexe(0.0, float('nan'))
)cmath.inf
(Python 3.6+; équivalent àcomplexe(float('inf'), 0.0)
)cmath.infj
(Python 3.6+; équivalent àcomplexe(0.0, float('inf'))
)
- Réponses précédentes
- Plus de réponses