さて、久しぶりにブログを更新しますが、ちょっと直近でpython教えていた相手がしっかり理解できていなかった、bool型(真理値)の戻り値について実際の事例を含めて解説していきたいと思います。
一般的によくみるboolean演算の解説内容
一般的によくpython関連の書籍やブログを見ていて説明されているboolの戻り値については以下のような例題が出されることが多いと思います。
# utf-8 # orの戻り値 print(True or True) #True print(True or False) #True print(False or True) #True print(False or False) #False #andの戻り値 print(True and True) #True print(True and False) #False print(False and True) #False print(False and False) #False
確かにこれ自体でどう判定されるかの大枠は理解できます。ただ、実際にTrue/False以外で値を適用して戻り値を取得しようとした場合に理解が足りていない部分があります。
実際の値を利用してbool演算の戻り値を確認する
さて、それでは、実際の値を変数代入してbool演算の戻り値がどうなるのか確認してみましょう。
x = ["a"] #True要素 y = [] #False要素 z = 1 #True要素 v = 0 #False要素 #orの場合 #どちらかがFalse -> Trueの値が返される print('x or y:{}'.format(x or y)) #x or y:['a'] print('y or x:{}'.format(y or x)) #y or x:['a'] #両方ともTrue -> 先にTrueとなった時点で判定が完了して、2つ目のTrue要素は判定されない print('x or z:{}'.format(x or z)) #x or z:['a'] print('z or x:{}'.format(z or x)) #z or x:1 #両方ともFalse -> 2つ目がFalseになった時点で値が確定し、2つ目の値が返される print('v or y:{}'.format(v or y)) #v and y:[] print('y or v:{}'.format(y or v)) #y and v:0 #andの場合 #どちらかがFalse -> Falseの値が返される print('x and y:{}'.format(x and y)) #x and y:[] print('y and x:{}'.format(y and x)) #y and x:[] #両方ともTrue -> 2つ目がTrueになった時点で値が確定し、2つ目の値が返される print('x and z:{}'.format(x and z)) #x and z:1 print('z and x:{}'.format(z and x)) #z and x:['a'] #両方ともFalse -> 1つ目がFalseになった時点で値が確定し、1つ目の値が返される print('v and y:{}'.format(v and y)) #v and y:0 print('y and v:{}'.format(y and v)) #y and v:[]
肝としては”どのタイミングで値が確定して戻り値を返すか”という点になります。
スクリプト内に記載しているので、結論はまさに上記のままです。
#orの場合 #どちらかがFalse -> Trueの値が返される #両方ともTrue -> 先にTrueとなった時点で判定が完了して、2つ目のTrue要素は判定されない
#andの場合 #どちらかがFalse -> Falseの値が返される #両方ともTrue -> 2つ目がTrueになった時点で値が確定し、2つ目の値が返される #両方ともFalse -> 1つ目がFalseになった時点で値が確定し、1つ目の値が返される
両方ともがTrue/Falseとなっている場合に、それぞれどのタイミングで値が返すかという点にand/orの違いがあり、それぞれを適切に理解しておくことがbool演算を正しく行う上で必要になってくることがあります。
まとめ
難しい内容ではないですが、適切にpythonの挙動を理解していく必要がある場合に必要となる知識の一つです。
ここら辺の習得は書籍を単に読み、写経するだけでなく、様々なケースを想定して実際に自分でコードを書き起こしながら習得していく内容になると思います。
一気にレベルアップという短期的なものではないですが、言語への適切な理解を醸成するために一つ一つ理解していってもらえるといいなと思います。