論理

真偽値

Python では, 真値は True, 偽値は False です. これらをまとめて bool値 (真偽値) と呼びます. まずはわかりやすいものから見て行きましょう.

In [1]: area = 100

In [2]: area < 1000
Out[2]: True

In [3]: area > 1000
Out[3]: False

Python すべての式が真または偽と評価されます. 真偽値を知るためには, bool() 組み込み関数を使います.

In [4]: bool('')
Out[4]: False

In [5]: bool("This is truthy")
Out[5]: True

In [6]: bool(10)
Out[6]: True

In [7]: bool(0)
Out[7]: False

In [8]: bool(1.0)
Out[8]: True

In [9]: bool(0.0)
Out[9]: False

In [10]: bool(1j)
Out[10]: True

In [11]: bool(0j)
Out[11]: False

In [12]: bool(None)
Out[12]: False

bool()True を返す式を truthy, False を返す式を falsy であるといいます. 上の例で見たように, 空の文字列は falsy, 空でない文字列は truthy です. ゼロにあたる数は falsy で それ以外は truthy です. None も falsy です.

組み込み型のところで学ぶ内容を先取りすると, list, tuple, dict, set, frozenset は すべて要素数がゼロのときに falsy, そうでなければ truthy です.

# list
In [13]: bool([])
Out[13]: False

In [14]: bool([1, 2, 3])
Out[14]: True

# tuple
In [15]: bool(())
Out[15]: False

In [16]: bool((1,))
Out[16]: True

# dict
In [17]: bool({})
Out[17]: False

In [18]: bool({'key': 'value'})
Out[18]: True

# set
In [19]: bool(set())
Out[19]: False

In [20]: bool({1, 2, 3})
Out[20]: True

# frozenset
In [21]: bool(frozenset())
Out[21]: False

In [22]: bool(frozenset((1, 2)))
Out[22]: True

実際に bool() を使用する機会はないかもしれません. 真偽値が必要な場合には自動的に呼び出されるからです.

ブール演算

bool 値どうしの二項演算 and, or と単項演算 not が定義されています.

and は2つのオペランドが真値のときに限り真値を返します.

In [23]: True and True
Out[23]: True

In [24]: False and True
Out[24]: False

In [25]: True and False
Out[25]: False

In [26]: False and False
Out[26]: False

and は1つ目が偽値であれば, 2つ目を評価しません. 次のような式でもエラーになりません.

In [27]: False and non_existent_variable
Out[27]: False

or は1つでも真値のオペランドががあれば真値を返します.

In [28]: True or True
Out[28]: True

In [29]: False or True
Out[29]: True

In [30]: True or False
Out[30]: True

In [31]: False or False
Out[31]: False

or は1つ目が真値であれば, 2つ目を評価しません. 次のような式でもエラーになりません.

In [32]: True or non_existent_variable
Out[32]: True

not は真偽値を反転させます.

In [33]: not True
Out[33]: False

In [34]: not False
Out[34]: True

比較

真偽値を返す重要な式は 比較 です. 大小関係の比較は >, >=, <, <= を使います. 意味は明らかでしょう.

In [35]: 1 < 2
Out[35]: True

In [36]: 1 > 2
Out[36]: False

In [37]: 2 ** 8 == 256
Out[37]: True

In [38]: 2 ** 8 != 256
Out[38]: False

大小関係が定義されていないものを比較しようとすると, TypeError となります.

In [39]: 1+2j < 3+3j
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-39-221a58c46cb2> in <module>()
----> 1 1+2j < 3+3j

TypeError: unorderable types: complex() < complex()

等式およびその否定は次のように書きます.

In [40]: 2 ** 8 == 256
Out[40]: True

In [41]: 2 ** 8 != 256
Out[41]: False

最後の式は, 次のように書いても同じことです.

In [42]: not 2 ** 8 == 256
Out[42]: False

isis not はオブジェクトの同一性を判定します. 特によく使われるのが None かどうかを判定する場合です. NoneType 型はたった一つのオブジェクト None を持つように作られているので is を使って判定するのが自然な方法です.

In [43]: None is None
Out[43]: True

In [44]: 0 is None
Out[44]: False

In [45]: "" is None
Out[45]: False

In [46]: "" is not None
Out[46]: True