※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト:【Python入門】if 文での真偽判定の仕方(TrueとNone)
【Python入門】if 文での真偽判定の仕方(TrueとNone)
python でif文を用いる事が多くありますが、そこで時折登場するNone について説明したいと思います。
if 文の中では、比較する条件があり、その条件文に対して 真 (True) もしくは偽 (False) であるかを判定しています。
None は False に近い概念ではあり、 ほとんどFalse = None と考えて差し支えないです。違いを言うとすれば、False は偽(0)であるという情報を持っているのに対して、None はそもそも「そこにデータが存在しない」ことを示す意味になります。
言葉面だけではわかりにくいかと思うので、具体例を出してみたいと思います。
True、Falseの取り扱い方
まずは、True と False について例を挙げます。
>>> a = 3
>>> if(a > 1):
... print "a > 1"
a > 1
これは値 a が 1 よりも大きい場合は、”a > 1 ” を表示するプログラムになります。
if 文の中では、a > 1 の真偽を判定します。今、a = 3 としているので、判定は真(True)となります。要は判定文の中が真か偽なのかを判定しているだけですので以下のようにしても同じ事です。
>>> if(True):
... print "True"
...
True
>>> if(False):
... print "True"
... else:
... print "False"
...
False
このように判定文の中が True なのか False か、で決まっており、プログラム内では結局のところ、1と0の判定になります(True = 1、False = 0)
念のため True = 1、False = 0 であることを確認してみましょう。
>>> print 1+True
2
>>> print 1+False
1
このように Trueと False は1 とゼロに対応した関係になっている事がわかります。
Noneの取り扱い方
それでは本題の None について述べていきます。
同じように if 文判定しましょう。
>>> print 1+True
2
>>> print 1+False
1
ここまではどうやら False = None と考えていいようです。
次に足し算をしてみましょう。
>>> print 1+None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
むむ、ここでエラーが出てしまいました。
冒頭で述べましたが、None はそこにデータがないということを示すので、値という概念がありません。ですので、その値を足し合わせようとしても無理なことがわかりますね。
どういうときに None が登場するかというと、1例としては辞書型のオブジェクトを使うときが挙げられるでしょう。
辞書型のオブジェクトの例は以下の通りです。
test = {"red":"apple","blue":"sky","green":"forest"}
red と apple を紐づける事で、red というキーワードで検索すると apple が出てくるようになります。ここでキーワード検索をするときは、get 関数が便利です。
>>> print test.get("red")
apple
それでは、この辞書に登録されていない単語(orange)で検索してみましょう。
>>> print test.get("orange")
None
ここで None が登場しました。これでお分かりかと思いますが、存在しないデータを示すときに None が使われます。False と意味合いが少し違うというのもおわかり頂けたと思います。
ちなみに test[“キーワード”] で直接アクセスするのも可能なのですが、存在しないキーワードを使ってしまうと以下のようにKeyErrorが出てしまいます。
>>> print test["orange"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'orange'
こうなってしまうとせっかく書いたプログラムが途中で強制終了してしまいますので、終了を伴わない get関数を使うのがオススメです。
Noneを使った比較
None の論理比較を使うときは、「is」と「==」のどちらでも大丈夫です。
>>> a = test.get("orange") # a に None を入れる
>>> if (a == None): # == を使った論理比較
... print "a == None"
a == None
>>> if (a is None): # is を使った論理比較
... print "a is None"
...
a is None
どちらでもちゃんと動いてますね。
ただ強いて言いますと、「is」 のほうが推奨されています。レアケースですが、「==」をエラーが出ることがあるそうです(著者はまだ遭遇した事がないですが)。
また実行スピードも 「is」のほうが早いと言われています。
検証のためにtimeitモジュールを使って処理時間を測定した結果を示します。
>>> timeit.timeit("1 == None", number=10000000)
0.3263418674468994
これの意味するところは、
「”1 == None” の比較を 10000000回行ったときにかかった所要時間を測定して、0.33秒でしたよ」ということです。
同様に ”1 is None” を行ってみます。
>>> timeit.timeit("1 is None", number=10000000)
0.19225311279296875
この結果からわかるように is を使ったときの方が 0.19 / 0.33 〜 60 % ほど処理時間が早い事がわかります。