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の評価は、左辺が偽の場合、次に右辺を評価する。
しかし逆の場合は注意。左辺が真の場合、右辺を評価しない。
また、こちらも同様に評価式の真偽値ではなく、評価の値が帰っている。