Python中AND-OR的用法

时间:2021-11-28 04:37:06

学习Python中的lambda函数的时候,才发现原来Python中的AND和OR还可以有一些别的用法。Python中的布尔逻辑计算的结果并非返回布尔值,而是返回它们相互之间的某一个。文章的部分例子来源于Dive Into Python。

AND

AND的表达式返回所遇到的第一个假值,如果表达式中无假值,则返回表达式中最后一个值。在Python中,0、‘’、[]、()、None这五个值在布尔环境中为假,例子如下:

>>>() and 'foo'
()
>>>'python' and 'foo' and 'lambda'
'lambda'

第一个表达式中,()为假,所以表达式从左到右计算,返回第一个假值。而第二个表达式中,并没有假值,所以返回最后一个真值。

OR

OR的表达式和And表达式一样也是从左到右的计算,计算的结果为所遇到的第一个真值,如果表达式无真值,就返回表达式最后一个假值。例子如下:

>>>'' or 'python'
'python'
>>>'' or () or {}
{}

第一个表达式中,从左到右计算,'python'字符串为第一个真值,返回它。第二个表达式中,所以个值都为假,返回最后一个假。  

 

 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中所有的空白去除,假如为假的话,则保留这些空白。