math.isnan()について

Python2.6以降にはmathモジュールにisnan()という関数が用意されているのですがこれはJavascriptのisNaNとはことなる働きをするものなのでちょっと嵌ってしまいました。

JavascriptのisNaN()関数は何でも評価することができtrueかfalseが返されます

window.alert(isNaN("abc")); //true
window.alert(isNaN("5")); //false
window.alert(isNaN(0)); //false
window.alert(isNaN("3.2")); //false
window.alert(isNaN([])); //false
window.alert(isNaN([3,4])); //true
window.alert(isNaN(["abc","def"])); //true
window.alert(isNaN(null)); //false

[]やnullがfalseを返すのは注意ですが、何でも評価できるという特徴を使って文字列と数字が混在する配列に適用して文字列と数字をわけると言った使い方ができます。

これに対してpythonのmath.isnan()は文字列を評価することができません。

import math

print math.isnan("abc") #TypeError

文字列を評価しようとするとTypeErrorになります。
math.isnan()を使ってTrue,Falseで文字列と数字をわけることはできないということですね。(例外を扱うことでわけることはできるかもしれませんが・・)

import math

print math.isnan(5) #False
print math.isnan(3.14) #False
print math.isnan("8") #TypeError

ではmath.isnan()は何を評価した場合にTrueを返すのかですが、

import math

print math.isnan(float("nan")) #True

これはTrueが返ります。つまりmath.isnan()は文字通り(?)float型の"nan"という値のみをTrueと評価するようです。