【转】Python三目运算,and or陷阱

在C语言中,三目运算经常用到(cond?a:b),非常的简洁,而在Python中不支持这种语法。
但是,可以用Python中and or来实现(这里是有陷阱的,下面会讲到)
我们来看下面几个表达式
>>> False or 1
1
>>> False or 0
0
>>> True or 0
True
>>> True and 1
1
>>>True and 0
0
>>> False and 1
False

也就是说,and or这个表达式会返回一个最终的表达式结果,而不是简单的True或者False。那么看如下几个表达式:
>>> True and 1 or 2   #TRUE?1:2
1
>>> False and 1 or 2 #TRUE?1:2
2

这是不是很像三目运算的结果呢?
这里你也许会想到文章开始的三目表达式可以这样表示
>>> cond and a or b

是的,在大多数情况下这个表达式都是正确的,但是上面提到的陷阱也在这里出现了
>>> cond, a, b = True, 0, 1 #这样赋值后
>>> cond and a or b         #这个表达式的结果会是什么呢?
1                                      #也就是b,而不是你预想的a

这是因为,在 and or运算中 空字符串 ‘’,数字0,空列表[],空字典{},空(),None,在逻辑运算中都被当作假来处理,如下面这个例子
>>> 'sss' and '' or 'bbb'
'bbb'

但是,不要担心,还是有办法的。
在的文章《和C语言三目运算符完全等价的表达式》中给出了如下表达方式
>>> c = cond and a or (not cond or a) or b #貌似有点太复杂了

在Dive into Python 中给出这样一个方法:
>>> (1 and [a] or [b])[0]   #也就是 (cond and [a] or [b])[0]

所以用 (cond and [a] or [b])[0] 就好了

posted @ 2013-04-25 10:30  三更_雨  阅读(220)  评论(0编辑  收藏  举报