Python精讲 | 条件赋值和and-or技巧

大家好,欢迎来到 Crossin的编程教室 !
在之前的 一段奇葩的1024代码 中,有这么一个写法:

看上去是一个由 and 和 or 组成的逻辑表达式。但实际的效果却相当于一个 if-else 的条件判断:
if i % 5 == 4:
D += '\n'
else:
D += ''

为什么会有这样的效果?
这就要说到之前讲过的 逻辑运算中的短路求值 :
条件 and 值1 or 值2
如果条件为False,它会触发and短路求值返回False,再进行or运算返回值2。
而如果条件为True,它会进行and运算返回值1,再触发or短路求值返回值1。
于是,就变相实现了一个单行的if-else结构。
其实在很多语言中,都有现成的类似语法,称作 条件赋值,常常是以 ?: 的三元运算符来实现。
条件 ? 值1 : 值2
如果问号前条件为真,则返回问号后的值,否则返回冒号的值。

Python中也有这种语法,同样以if-else作为关键字,但写法上略有不同:
值1 if 条件 else 值2

在非常非常早期的Python版本中,并不支持这种单行的if-else语法,所以会有人用 and-or 这样的逻辑组合技巧来替代实现。
但是,这个技巧是有漏洞的。
比如我们把前面那个例子的条件反一下,并调换两个值的顺序。逻辑上应该是相同的。但执行结果却不对了:
D += i % 5 != 4 and '' or '\n'

这又是为什么呢?
再回到我们前面说的原理上:
条件 and 值1 or 值2
如果条件为True,它会进行and运算返回值1。但值1本身也可能是个空值,也就是逻辑上的False,那么就不会触发or的短路求值,这个条件赋值的逻辑也就不成立了。
当然,如果想补上这个漏洞也不是不行,只需要保证值1一定为非空非0值就可以。所以把它们都变成列表,再从列表中取值,就OK了。
D += (i % 5 != 4 and [''] or ['\n'])[0]
或者,我们也可以这么写
D += ('', '\n')[i % 5 == 4]
把两个值作为元组,把条件作为索引,也可以实现条件赋值
你能看出这么写是什么意思吗?
本文分享自 Crossin的编程教室 微信公众号, 前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
社区
活动
资源
关于
腾讯云开发者
扫码关注腾讯云开发者
领取腾讯云代金券
热门产品
热门推荐
更多推荐
Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2024 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有