Pythonでの真偽値評価(AND/ORの評価)の動き

PythonではPythonライブラリリファレンスにあるように、

どのオブジェクトも if または while 条件文の中や、以下のブール演算における被演算子として真値テストを行うことができます。以下の値は偽であると見なされます:

* None

* False

* 数値型におけるゼロ。例えば 0 、 0L 、 0.0 、 0j 。

* 空のシーケンス型。例えば '' 、 () 、 [] 。

* 空のマッピング型。例えば {} 。

* __nonzero__() または __len__() メソッドが定義されているようなユーザ定義クラスのインスタンスで、それらのメソッドが整数値ゼロまたは bool 値の False を返すとき。

それ以外の値は全て真であると見なされます -- 従って、ほとんどの型のオブジェクトは常に真です。

ブール値の結果を返す演算および組み込み関数は、特に注釈のない限り常に偽値として 0 またはFalse を返し、真値として 1 または True を返します (重要な例外: ブール演算 "or" および "and" は常に被演算子の中の一つを返します)。

ということで動きを理解するために実験してみました。

AND評価の実験

AND評価実験のソース(andResult.py)

やってることは、True/Falseの場合の評価、-1,0,1の場合の真偽評価。
想定範囲内では"miss"と表示されるのはないです(出力にあまり意味はない)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

if True and True:
        print "T:True and True:", True and True
else:
        print "miss"

if -1 and True:
        print "T:-1 and True:", -1 and True
else:
        print "miss"

if 0 and True:
        print "miss"
else:
        print "F:0 and True:", 0 and True

if 1 and True:
        print "T:1 and True:", 1 and True
else:
        print "miss" 

if True and 1:
        print "T:True and 1:", True and 1
else:
        print "miss" 

if 2-2 and True:
        print "miss"
else:
        print "F:2-2 and True:", 2-2 and True

if 2-1 and True:
        print "T:2-1 and True:", 2-1 and True
else:
        print "miss"

if 2-3 and True:
        print "T:2-3 and True:", 2-3 and True
else:
        print "miss"

if True and False:
        print "miss"
else:
        print "F:True and False:", True and False

if False and True:
        print "miss"
else:
        print "F:False and True:", False and True

if True and "":
        print "miss"
else:
        print 'F:True and "":', True and ""

if True and None:
        print "miss"
else:
        print "F:True and None:", True and None
結果
(フォーマット)[IFの評価結果]:[評価式]:[評価の返り値]
% python andResult.py 
T:True and True: True
T:-1 and True: True
F:0 and True: 0
T:1 and True: True
T:True and 1: 1
F:2-2 and True: 0
T:2-1 and True: True
T:2-3 and True: True
F:True and False: False
F:False and True: False
F:True and "": 
F:True and None: None

至極当然の結果です。False、0、"" が式に入っているのはすべてFalseという結果になっている。
これは結果からもわかるが、左辺の評価が偽の場合は、右辺の評価が行われないのがわかる(3つめの評価)。
そして重要なのが、左辺が真で、右辺が偽の場合、真偽値評価の返り値は、評価式の真偽(True/False)の値ではなく、評価結果の値が帰っているのがわかる(4つめと5つめの評価から)。

また、評価式には数字、オブジェクト、演算が使用できるのがわかる。

OR評価の実験

やってることはAND評価とほぼ同じ。

OR評価の実験のソース(onResult.py)
#!/usr/bin/env python
# -*- coding: utf-8 -*-

if True or True:
        print "T:True or True:" , True or True
else:
        print "miss"

if -1 or True:
        print "T:-1 or True:", -1 or True
else:
        print "miss"

if 0 or True:
        print "T:0 or True:", 0 or True
else:
        print "miss"

if 1 or False:
        print "T:1 or False:", 1 or False
else:
        print "miss" 

if 2-2 or False:
        print "miss"
else:
        print "F:2-2 or False:", 2-2 or False

if 2-1 or False:
        print "T:2-1 or False:", 2-1 or False
else:
        print "miss"

if 2-3 or False:
        print "T:2-3 or False:", 2-3 or False
else:
        print "miss"

if  False or True:
        print  "T:False or True:",  False or True
else:
        print "miss" 

if "" or True:
        print 'T:"" or True:', "" or True
else:
        print "miss"

if True or "":
        print 'T:True or "":', True or ""
else:
        print "miss"

if None or True:
        print "T:None or True:", None or True
else:
        print "miss"
結果
(フォーマット)[IFの評価結果]:[評価式]:[評価の返り値]
% python orResult.py 
T:True or True: True
T:-1 or True: -1
T:0 or True: True
T:1 or False: 1
F:2-2 or False: False
T:2-1 or False: 1
T:2-3 or False: -1
T:False or True: True
T:"" or True: True
T:True or "": True
T:None or True: True

結果はandResult.pyとにてる。orの評価は、左辺が偽の場合、次に右辺を評価する。
しかし逆の場合は注意。左辺が真の場合、右辺を評価しない
また、こちらも同様に評価式の真偽値ではなく、評価の値が帰っている。