Python入門 - None / 真理値型(bool); 何もないことを示すNoneと真理値を示す真理値型について
本ページではPythonの入門コンテンツとして初学者向けにPythonでの真理値型とNoneに関する取り扱いについて記載します。
要約#
Pythonでは何もないことを示すための None というデータが存在する
PythonではYesかNoかを示すための真理値型 ( bool )が存在する
真理値型は主に比較演算の結果を表現するのに利用される
真理値型同士を計算するブール演算がある
演算子には順序がある
Noneという存在#
Pythonには何もないことを示すためのデータ型として None というものが存在します。
Noneの表現方法#
Pythonには None と呼ばれる特殊なデータ形式が存在します。これは NoneType という型を持っています。
print(None)
# => None
type(None)
# => <class 'NoneType'>
名前の通り None の意味するところは 「何もない」という状態です。 None も今まで通り変数に代入することが可能です。
none_data = None
print(none_data)
# => None
Noneと他の型への相互変換#
None を他の型へ変換することは基本的にないと思いますが説明します。
str への変換はそのまま None という文字列に変換され、数値への変換は失敗します。
str(None)
# => None
int(None)
# => エラーになる
Noneは何に使われるか#
一見すると全く意味のないデータであるように思われますが、次のような場合で None という値が利用されることがあります。
変数の宣言を行う#
先ほど例示した変数への None の代入は Python入門 - 変数とは何か? プログラム上で一時的に保持するデータについて でお話した「変数の宣言」を行う目的で利用されることがあります。変数をこれから使うけど、まだ何を入れるか決めていないよ、といった状態で使うことがあります
データを検索したが何も見つからなかったことを示す#
特定のデータベースや配列といったデータから目的のデータを検索した時、何も見つけられなかったということを示すために None が返される場合があります。該当するものなし、といった意味です。
真理値型について#
真理値型 (Boolean type) とは 真 (true) であるか 偽 (false) であるかを示すようなデータ型のことです。要するに 〇 か × か、 0か1か、 YesかNoかを示すような機能になります。今まで紹介した文字列や数値といったもの比べると結構特殊な型です。
真理値型の表現方法#
Pythonでは真である場合を True 、 偽である場合を False と先頭を大文字で表現します。真理値はPythonでは bool という型で表現されます。
# 真
truth = True
# 偽
false = False
type(truth)
# => <class 'bool'>
真理値型と他の型の相互変換#
真理値型への変換#
真理値は今まで紹介した型から変換することが可能ですが、真理値の性質上2値に分類されたものが格納されます。
例えば文字列については中に文字が入っているかどうか、の結果が格納されます。
bool('')
# => False
bool('中身あり')
# => True
数値については、 0 が False そしてそれ以外の値はすべて True として変換されます。
bool(0)
# => False
bool(1)
# => True
bool(-100)
# => True
真理値型からの変換#
真理値型は数値に変換すると False が 0 、 True が 1 となります。ですがこの変換はあまり利用されないと思います。
int(False)
# => 0
int(True)
# => 1
Noneからの変換#
None は変換すると False になります。「何もない」、なので確かに False になりそうですね。
bool(None)
# => False
真理値型の真骨頂: 比較演算の結果#
さて、真理値型だけをぱっと見てもあまり用途が思いつかないと思います。このデータ型は 主にデータ同士の比較結果を示すのに利用されます。
比較演算について#
Pythonで用意されている比較演算としては以下のものがあります。
演算子 | 意味 |
---|---|
< | 左辺が右辺よりも小さいかどうかを計算 |
<= | 左辺が右辺よりも小さい、あるいは等しいかどうかを計算 |
> | 右辺が左辺よりも小さいかどうかを計算 |
>= | 右辺が左辺よりも小さい、あるいは等しいかどうかを計算 |
== | 左辺と右辺が等しいかどうかを計算 |
!= | 左辺と右辺が等しいくないかどうかを計算 |
is | 左辺と右辺が同一のオブジェクトであるかどうかを計算 |
is not | 左辺と右辺が同一のオブジェクトではないかどうかを計算 |
表に書いてある 演算子 (operator) という名称は名前こそ難しそうですが、単に計算に利用する記号の名前だと思っておいてください。
「左辺」(left-hand side)と「右辺」(right-hand side)は演算子をまたいで左側と右側のことを指します。下記の例では左辺が 1 + 2 で右辺が 5 -4 ですね。
# 左辺 右辺
1 + 2 > 5 - 4
オブジェクトとは?#
is と is not の説明にある「オブジェクト」という単語は実は本入門コースではここが初出です。オブジェクトとは何でしょうか?
オブジェクトは オブジェクト指向型プログラミング(object oriented programming; OOP) で利用される概念の1つで、クラス (class) のデータを実体化させたものをオブジェクト、あるいはインスタンスと呼びます。
何を言っているかわからないと思います。なので今は気にしないでください。後でクラスを学ぶ機会がありますのでそちらで説明させていただきます。
逆に言えばクラスを学ばなければこの演算子たちに出番はありませんので無視してOKということです。
比較演算の実例#
以下に具体例を幾つか挙げます。
1 > 5
# => False
10 > 5
# => True
10 <= 10
# => True
20 >= 15
# => True
1 == 2
# => False
1 != 2
# => True
13 % 5 == 3
# => True (13を5で割ったあまりが3)
ちなみに、現時点では is と not is はほとんど == と != と同義です。
1 is 1
# => True
1 is not 0
# => True
真理値同士の計算#
真理値型は真理値型同士で計算を行うことが可能です。これはブール演算と呼ばれます。
以下にブール演算で利用される演算子 or , and , not の説明をします。
演算例 | 説明 |
---|---|
A or B | A と B のどちらかが True であれば True 、そうでなければ False |
and | A と B の両方が True であれば True 、そうでなければ False |
not A | A が True であれば False 、そうでなければ True |
not だけ右辺と左辺という形式ではないため、ここの表では演算例という形式で示しました。
これらの演算子は単純な英語として理解してOKです。以下に例を示します。
True or False
# => True
True and False
# => False
not True
# => False
先ほどの比較演算を絡めると以下のようになります。
(100 > 99) or (200 > 1000)
# => True
(100 % 5 == 0) and (2**2 == 3)
# => False
(10 * 2 == 20) and (not (10 == 11))
# => True
演算子の順序について#
これまででいくつかの演算子(計算記号)が出てきました。
数学的な演算子 ( + , - , * , / など)
比較演算子 ( == , < , > など)
ブール演算子 ( and , or , not )
これらの演算子が入り乱れた時、どのような計算順序になるのでしょうか。単純に左から順に計算されてしまうのでしょうか?
答えはNOです。 演算子には計算の順序が存在します。 数学記号であれば + や - よりも * と / が先行して計算される、というよくある計算順序のルールは守られるような仕組みになっています。
演算の順序を気にせずにコードを書いてしまうと、自分が思っていた順序とは違う計算をされてしまいバグとなる可能性もあるため注意が必要です。
計算順序を入れ替えるためには、先ほどの例で示したような カッコ () で括る方法を利用します。カッコの中に式を入れることによって、そこが優先的に評価されるようになります。
以下に具体的なPython内部での計算順序をコメントで記載します。
# 先ほどの例の1つで、右側の == の計算についているカッコを外したもの
(10 * 2 == 20) and (not 10 == 11)
# 右辺と左辺を同時に1個ずつ計算していきます。
# 左辺: 比較演算子よりも数学的演算子が優先されます。
# 右辺: not よりも比較演算子が優先されます。したがって
#
# (20 == 20) and (not False)
#
# これをさらに進めると
#
# True and True
#
# したがって最終的な結果は True
計算順序を理解していればカッコをつけずとも良い場合もありますが、単純に視覚的にわかりやすくするためにつけることもあります。
計算の順序に関する具体的な情報は Pythonリファレンス のページをご参照ください。
まとめ#
本ページでは None と 真理値型である bool 、そして真理値を計算する方法について解説しました。
これらのデータ型だけ見ると特に面白みはなさそうですが、条件分岐にかかわってくる非常に重要なデータ型です。
プログラムは条件分岐さえあれば大抵の処理は記述ができるようになる[1] ため、そこに密接にかかわってくるこれらのデータ型も重要なわけですね。