前言
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风格的三目运算符一致.