PythonでのAND-ORの使い方

1847 ワード

Pythonのlambda関数を勉強したとき、PythonのANDとORには別の使い方があることに気づいた.Pythonのブール論理計算の結果はブール値を返すのではなく,それらの相互間のいずれかを返す.文章の一部の例はDive Into Pythonに由来する.
 
AND
ANDの式は、出会った最初の偽値を返し、式に偽値がない場合は、式の最後の値を返します.Pythonでは、0、'、[]、()、Noneの5つの値がブール環境で偽であり、例は以下の通りである.
>>>() and 'foo'
()
>>>'python' and 'foo' and 'lambda'
'lambda'

最初の式では、()が偽であるため、式は左から右に計算され、最初の偽値が返されます.2番目の式では、偽の値はないので、最後の真の値を返します.
OR
ORの式はAnd式と同様に左から右への計算であり,計算結果は遭遇した最初の真値であり,式に真値がなければ式の最後の偽値を返す.例は次のとおりです.
>>>'' or 'python'
'python'
>>>'' or () or {}
{}

最初の式では、左から右に計算され、「python」文字列は最初の真の値であり、返されます.2番目の式では、値が偽であるため、最後の偽を返します.  
 
AND-ORテクニック
PythonではAND-ORを使ってCのboolをシミュレートできますか?a:bの式.まず例を見てみましょう.
>>>a = 'first'
>>>b = 'second'
>>>1 and a or b
'first'
>>>0 and a or b
'second'

これでAND-ORを使えばbool?a:bの要求.しかし、a値が偽物であれば、最後の結果は私たちが望んでいるものではないという問題があります.
>>>a = ''
>>>b = 'second'
>>>1 and a or b
'second'

aは偽であるため、1 and aは','と'second'の計算結果は'second'である.実は私たちは以下のテクニックを利用して安全にAND-ORを使うことができます.
>>> a = ""
>>> b = "second"
>>> (1 and [a] or [b])[0]

空でないリストを使用することで、aとbが偽値であることを防止します.これで目的達成でしょう!このような使い方をlambda式と組み合わせて使うことがあります.例えば、次のような表現があります.
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

これはlambda関数であり,collapseが真であればs中のすべての空白を除去し,偽であればこれらの空白を保持する.