社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Crossin的编程教室 • 5 月前 • 99 次点击  

大家好,欢迎来到 Crossin的编程教室 !

在之前的 一段奇葩的1024代码 中,有这么一个写法:

看上去是一个由 and 和 or 组成的逻辑表达式。但实际的效果却相当于一个 if-else 的条件判断:

if i % 5 == 4:    D += '\n'else:    D += ''

为什么会有这样的效果?

这就要说到之前讲过的 逻辑运算中的短路求值

条件 and1 or2

如果条件为False,它会触发and短路求值返回False,再进行or运算返回值2。

而如果条件为True,它会进行and运算返回值1,再触发or短路求值返回值1。

于是,就变相实现了一个单行的if-else结构。

其实在很多语言中,都有现成的类似语法,称作 条件赋值,常常是以 ?: 的三元运算符来实现。

条件 ? 值1 : 值2

如果问号前条件为真,则返回问号后的值,否则返回冒号的值。

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

1 if 条件 else2

在非常非常早期的Python版本中,并不支持这种单行的if-else语法,所以会有人用 and-or 这样的逻辑组合技巧来替代实现。

但是,这个技巧是有漏洞的。

比如我们把前面那个例子的条件反一下,并调换两个值的顺序。逻辑上应该是相同的。但执行结果却不对了:

D += i % 5 != 4 and '' or '\n'

这又是为什么呢?

再回到我们前面说的原理上:

条件 and1 or2

如果条件为True,它会进行and运算返回值1。但值1本身也可能是个空值,也就是逻辑上的False,那么就不会触发or的短路求值,这个条件赋值的逻辑也就不成立了。

当然,如果想补上这个漏洞也不是不行,只需要保证值1一定为非空非0值就可以。所以把它们都变成列表,再从列表中取值,就OK了。

D += (i % 5 != 4 and [''] or ['\n'])[0]

或者,我们也可以这么写




    
D += ('', '\n')[i % 5 == 4]

把两个值作为元组,把条件作为索引,也可以实现条件赋值

你能看出这么写是什么意思吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/164947
 
99 次点击