首页 > 代码库 > 飘逸的python - and_or大法

飘逸的python - and_or大法

前言

George Boole神奇的将逻辑变成了代数,使之可以演算,因此,被叫做布尔代数.而and和or是布尔代数其中的2个符号.


首先,我们要明确一个东西,Python和很多语言一样,都是返回两个被操作对象中的一个,而非它们的布尔表达式 True 或 False.

比如

>>False and 2
False
>>True and 2
2
>>1 and 1
1

其次,了解什么是短路逻辑.
短路逻辑的意思是后面的不用执行了.有两种情况.
1.x and y,如果x为假,x and y肯定为假,不用管y是什么了.
2.x or y, 如果x为真,x or y肯定为真,不用管y是什么了.


and_or大法有哪些应用呢?

or,用来设置默认值

比如, 我们从redis中获取json过的字典对象,要防止没数据而出现ValueError: No JSON object could be decoded.
我们一般会
if data:
    json.loads(data)
使用and_or大法,可以直接 json.loads(data or ‘{}‘), 通过or来设置默认值.


and,利用前面的为True才执行后面的,来消灭if

比如电商,顾客要买东西,通过多条件筛选,数据存在mongodb,属性有价格/品牌/尺寸/颜色.
用户可能不设置或设置多个筛选条件,我们要一一判断.
按照一般的写法,应该是:

queryexr = {}
if price:
    queryexr.update({'p':price})
if brand:
    queryexr.update({'b':brand})
if size:
    queryexr.update({'s':size})
if color:
    queryexr.update({'c':color})
dp.collection.find(queryexr)
太多if了,看着头痛,使用and_or大法:

price and queryexr.update({'p':price})
brand and queryexr.update({'b':brand})
size  and queryexr.update({'s':size})
color and queryexr.update({'c':color})

实现三目条件符

c语言中有三目条件符 <condition> ? <expression1> : <expression2>
python可以通过<expression1> if <condition> else <expression2>来达到同样目的
另外, python还可以使用and_or大法, <condition> and <expression1> or <expression2>
怎么理解这句表达式呢?
比如 age>=18 and ‘adult‘ or ‘kid‘.
等价于 ((age>=18 and ‘adult‘) or ‘kid‘), 其中<condition>是age>=18.
如果<condition>为True, (age>=18 and ‘adult‘)的结果是‘adult‘, (‘adult‘ or ‘kid‘)的结果是‘adult‘,所以整条式子结果是‘adult‘
如果<condition>为False,(age>=18 and ‘adult‘)的结果是False, (False or ‘kid‘)的结果是‘kid‘, 所以整条式子结果是‘kid‘

PS. python这两种实现三目条件符的风格可能有点易混淆,总结就是,如果用if...else...大法,<condition>是在if后面;如果用and_or大法,<condition>在最前面,顺序跟c风格的三目运算符一致.



飘逸的python - and_or大法