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

时间: 2024-10-25 14:09:31

飘逸的python - and_or大法的相关文章

飘逸的python - __new__、__init__、__call__傻傻分不清

__new__: 对象的创建,是一个静态方法.第一个參数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个參数是self. __call__ : 对象可call.注意不是类,是对象. 先有创建,才有初始化.即先__new__,而后__init__. 上面说的不好理解,看样例. 对于__new__ class Bar(object): pass class Foo(object): def __new__(cls,

飘逸的python - 为什么修改全局的dict变量不用global关键字

比如下面这段代码 s = 'foo' d = {'a':1} def f(): s = 'bar' d['b'] = 2 f() print s print d 为什么修改字典d的值不用global关键字先声明呢? 这是因为, 在s = 'bar'这句中,它是"有歧义的",因为它既可以是表示引用全局变量s,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global. 在d['b']=2这句中,它是"明确的",因为如果把d

飘逸的python - 几行代码实现unix管道风格的函数调用

用过linux的基本知道它的管道,是将一个程序或命令的输出作为还有一个程序或命令的输入. 废话少说,以下我们看用python怎么实现unix管道风格的函数调用. #coding=utf-8 class Pipe: def __init__(self, func): self.func = func def __ror__(self, other): return self.func(other) @Pipe def add(args): return sum(args) @Pipe def in

飘逸的python - 作用域与lookup策略

首先了解什么是命名空间,命名空间是一个"命名->对象"的映射,在python中用dict实现的. 而作用域,是指能直接访问到的命名空间. 当我们访问一个变量时,会按LEGB的顺序来lookup: L->Local. 即局部变量,比如定义在def或lambda中的变量. E-> Enclosing function locals. 即闭包中的变量. G->Global (module).全局变量. B->Built-in .内置变量,比如len()/KeyE

飘逸的python - 字符串的KMP匹配算法

首先我们来看一下字符串的朴素匹配. 可以想象成把文本串s固定住,模式串p从s最左边开始对齐,如果对齐的部分完全一样,则匹配成功,失败则将模式串p整体往右移1位,继续检查对齐部分,如此反复. #朴素匹配 def naive_match(s, p): m = len(s); n = len(p) for i in range(m-n+1):#起始指针i if s[i:i+n] == p: return True return False 关于kmp算法,讲的最好的当属阮一峰的<字符串匹配的KMP算法

飘逸的python - 增强的格式化字符串format函数

自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和:来代替%. "映射"示例 通过位置 字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次,不过2.6不能为空{},2.7才可以. 通过关键字参数 通过对象属性 通过下标 有了这些便捷的"映射"方式,我们就有了偷懒利器.基本的Python知识

飘逸的python - 什么是魔术方法(magic method)

我们经常看到各种被双下划线环绕的方法,如__init__,它们就是魔术方法. 魔术方法是python语言预定好的"协议",不同魔术方法在不同场景下,会被隐式调用.我们通过重载这些方法,从而操控各种行为. class A(object): def __str__(self): return "I am A,2333" def __len__(self): return 42 a = A() print a#输出 "I am A,2333" prin

飘逸的python - 代码即文档docstring

什么是docstring 在软件工程中,其实编码所占的部分是非常小的,大多是其它的事情,比如写文档.文档是沟通的工具. 在python中,比较推崇在代码中写文档,代码即文档,比较方便,容易维护,直观,一致. 代码写完,文档也出来了.其实Markdown也差不多这种思想,文本写完,排版也完成了. 看看PEP 0257中对docstring的定义: A docstring is a string literal that occurs as the first statement in a modu

飘逸的python - 使用dis模块进行代码层次的性能剖析

dis - Disassembler for Python bytecode,即把python代码反汇编为字节码指令. 使用超级简单:python -m dis xxx.py 当我在网上看到while 1比while True快的时候,我感到很困惑,为何会有这种区别呢? 于是使用dis来深入. 假设est_while.py代码如下. #coding=utf-8 while 1: pass while True: pass 下面是使用dis来进行剖析. E:\>python -m dis test