分类: Python/Ruby
2011-08-03 17:41:27
在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] 因为,即使 a或者b为一个逻辑假的值,将他放入集合中后,就为假了,也就是[False] [None]都不为假。 此外,我认为还可以这样实现 >>> (b, a)[cond and 1 or 0] #这种方法需要主意的地方就是,Tuble中a和b的位置是颠倒的 另,在“深圳夜归人”的文章里给出了,用dict的一种方式 >>> max_ab = {True:a, False:b}[a > b] 但是这种方法没有普适性,因为cond的取值不一定为True False 所以建议使用Dive into Python的方法,或者我的方法 |