原文:http://hi.baidu.com/tuuboo/blog/item/0945d3fc2c4fbe43d6887dbb.html

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

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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。那么看如下几个表达式:

1
2
3
4
>>> True and 1 or 2    #TRUE?1:2           
1
>>> False and 1 or 2 #TRUE?1:2
2

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

1
>>> cond and a or  b

是的,在大多数情况下这个表达式都是正确的,但是上面提到的陷阱也在这里出现了

1
2
>>> cond, a, b = True, 0, 1  #这样赋值后         
>>> cond and a or b #这个表达式的结果会是什么呢?

1 #也就是b,而不是你预想的a
这是因为,在 and or运算中 空字符串 ‘’,数字0,空列表[],空字典{},空(),None,在逻辑运算中都被当作假来处理,如下面这个例子

1
2
>>> 'sss' and '' or 'bbb'         
'bbb'

但是,不要担心,还是有办法的。
在的文章《和C语言三目运算符完全等价的表达式》中给出了如下表达方式

1
>>> c = cond and a or (not  cond or a) or b #貌似有点太复杂了

在Dive into Python 中给出这样一个方法:

1
>>> (1 and [a] or [b])[0]    #也就是 (cond and [a] or [b])[0]

因为,即使 a或者b为一个逻辑假的值,将他放入集合中后,就为假了,也就是[False] [None]都不为假。

此外,我认为还可以这样实现

1
>>> (b, a)[cond and 1 or 0]  #这种方法需要主意的地方就是,Tuble中a和b的位置是颠倒的

另,在“深圳夜归人”的文章里给出了,用dict的一种方式

1
>>> max_ab = {True:a,  False:b}[a > b]

但是这种方法没有普适性,因为cond的取值不一定为True False

所以建议使用Dive into Python的方法,或者我的方法.