python使用3目运算符

23 篇文章 0 订阅

转自:http://hi.baidu.com/tuuboo/item/7624433b516f89c7392ffab5

c、c++都大家都熟悉三目运算符
   C?X:y

实际上python中可以这么使用:

(1)result=(x<y and [x] or [y])[0]
(2)result=x if x<y else y

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]

因为,即使 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的方法,或者我的方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值