はじめに
地味に気をつけていないと判定で思わぬミスがあるので、pythonでの0,None,numpy.nanの扱いについてまとめました。
比較まとめ
0 | None | numpy.nan | |
---|---|---|---|
type() | class <'int'> | class <'NoneType'> | class <'float'> |
bool() | False | False | True |
他の数値との演算 | 0で割るとZeroDivisionError | TypeError | numpy.nan |
is None | False | True | False |
numpy.isnan() | False | False | True |
自分との比較 | True | True | False |
それぞれの判定方法
None
is Noneを使う。
test.py
# NoneだったらFalse, それ以外ならTrueを返す
f = lambda x: True if x is not None else False
f(0)
# -> True
f(numpy.nan)
# -> True
f(None)
# -> False
numpy.nan
math.isnan(), numpy.isnan()を使う、または自分自身と比較する。
test.py
numpy.isnan(0)
# -> False
numpy.isnan(None)
# -> TypeError(Noneが数値でないため)
numpy.isnan(numpy.nan)
# -> True
# 自分自身との比較
0 == 0
# -> True
None == None
# -> True
numpy.nan == numpy.nan
# -> False
0,None,np.nanを判定する
test.py
def judge(data):
if data is None:
print('None')
elif isinstance(data, int):
print('0 or other number')
else:
# 非数
print('Not A Number')
そもそもNone, numpy.nanって何?
None
型 NoneType の唯一の値です。None は、関数にデフォルト引数が渡されなかったときなどに、値の非存在を表すのに頻繁に用いられます。
python公式Doc
存在しないことを示すための定数。
存在しないからNoneに対する演算はError。
numpy.nan
IEEE 754 floating point representation of Not a Number (NaN).
scipy公式ドキュメント
数ではない浮動小数点を表す数(非数)。
自分自身との比較でFalseを返すのは非数としての特性。
まとめ
地味に判定で引っかかることがあるので、まとめました。
もっとスマートに判定する方法がありそうな気がします。
何かありましたらコメントをお願いします。