======== 論理 ======== 真偽値 -------- Python では, 真値は ``True``, 偽値は ``False`` です. これらをまとめて bool値 (真偽値) と呼びます. まずはわかりやすいものから見て行きましょう. .. ipython:: In [9]: area = 100 In [10]: area < 1000 Out[10]: True In [11]: area > 1000 Out[11]: False Python すべての式が真または偽と評価されます. 真偽値を知るためには, ``bool()`` 組み込み関数を使います. .. ipython:: In [16]: bool('') Out[16]: False In [17]: bool("This is truthy") Out[17]: True In [18]: bool(10) Out[18]: True In [19]: bool(0) Out[19]: False In [20]: bool(1.0) Out[20]: True In [21]: bool(0.0) Out[21]: False In [22]: bool(1j) Out[22]: True In [23]: bool(0j) Out[23]: False In [45]: bool(None) Out[45]: False ``bool()`` が ``True`` を返す式を **truthy**, ``False`` を返す式を **falsy** であるといいます. 上の例で見たように, 空の文字列は falsy, 空でない文字列は truthy です. ゼロにあたる数は falsy で それ以外は truthy です. ``None`` も falsy です. 組み込み型のところで学ぶ内容を先取りすると, ``list``, ``tuple``, ``dict``, ``set``, ``frozenset`` は すべて要素数がゼロのときに falsy, そうでなければ truthy です. .. ipython:: # list In [30]: bool([]) Out[30]: False In [31]: bool([1, 2, 3]) Out[31]: True # tuple In [32]: bool(()) Out[32]: False In [33]: bool((1,)) Out[33]: True # dict In [34]: bool({}) Out[34]: False In [35]: bool({'key': 'value'}) Out[35]: True # set In [36]: bool(set()) Out[36]: False In [37]: bool({1, 2, 3}) Out[37]: True # frozenset In [38]: bool(frozenset()) Out[38]: False In [44]: bool(frozenset((1, 2))) Out[44]: True 実際に ``bool()`` を使用する機会はないかもしれません. 真偽値が必要な場合には自動的に呼び出されるからです. ブール演算 ------------- ``bool`` 値どうしの二項演算 ``and``, ``or`` と単項演算 ``not`` が定義されています. ``and`` は2つのオペランドが真値のときに限り真値を返します. .. ipython:: In [11]: True and True Out[11]: True In [12]: False and True Out[12]: False In [13]: True and False Out[13]: False In [14]: False and False Out[14]: False ``and`` は1つ目が偽値であれば, 2つ目を評価しません. 次のような式でもエラーになりません. .. ipython:: In [18]: False and non_existent_variable Out[18]: False ``or`` は1つでも真値のオペランドががあれば真値を返します. .. ipython:: In [19]: True or True Out[19]: True In [20]: False or True Out[20]: True In [21]: True or False Out[21]: True In [22]: False or False Out[22]: False ``or`` は1つ目が真値であれば, 2つ目を評価しません. 次のような式でもエラーになりません. .. ipython:: In [23]: True or non_existent_variable Out[23]: True ``not`` は真偽値を反転させます. .. ipython:: In [24]: not True Out[24]: False In [25]: not False Out[25]: True .. ipython: 比較 ------- 真偽値を返す重要な式は **比較** です. 大小関係の比較は ``>``, ``>=``, ``<``, ``<=`` を使います. 意味は明らかでしょう. .. ipython:: In [9]: 1 < 2 Out[9]: True In [10]: 1 > 2 Out[10]: False In [14]: 2 ** 8 == 256 Out[14]: True In [15]: 2 ** 8 != 256 Out[15]: False 大小関係が定義されていないものを比較しようとすると, ``TypeError`` となります. .. ipython:: :okexcept: In [11]: 1+2j < 3+3j --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 1+2j < 3+3j TypeError: unorderable types: complex() < complex() 等式およびその否定は次のように書きます. .. ipython:: In [14]: 2 ** 8 == 256 Out[14]: True In [15]: 2 ** 8 != 256 Out[15]: False 最後の式は, 次のように書いても同じことです. .. ipython:: In [20]: not 2 ** 8 == 256 Out[20]: False ``is`` と ``is not`` はオブジェクトの同一性を判定します. 特によく使われるのが ``None`` かどうかを判定する場合です. ``NoneType`` 型はたった一つのオブジェクト ``None`` を持つように作られているので `is` を使って判定するのが自然な方法です. .. ipython:: In [30]: None is None Out[30]: True In [31]: 0 is None Out[31]: False In [32]: "" is None Out[32]: False In [33]: "" is not None Out[33]: True