python中 and 和 or 运算的核心思想 ——— 短路逻辑

1. 包含一个逻辑运算符

  首先从基本的概念着手,python中哪些对象会被当成 False 呢?而哪些又是 True 呢?

在Python中,None、任何数值类型中的0、空字符串“”、空元组()、空列表[]、空字典{}都被当作False,还有自定义类型,如果实现了  __ nonzero __ () 或 __ len __ () 方法且方法返回 0 或False,则其实例也被当作False,其他对象均为True。

  下面是最简单的逻辑运算:

	True  and True    ==> True					True  or True    ==> True
True and False ==> False True or False ==> True
False and True ==> False False or True ==> True
False and False ==> False False or False ==> False

  利用上面两点我们就可以举一些例子:

example 1

	>>> a = [0, 1, '' ,3]
>>> a[0] and a[1]
0

  a[0] = 0 , a[1] = 1 , 所以 a[0] and a[1] 就变成了 0 and 1 (False and True),所以为 0 (False)。

example 2

	>>> a = [0, 1, '' ,3]
>>> a[2] and a[1]
''

  两个同时为 False ,返回左边的值。

2. 包含两个及以上的逻辑运算符

  逻辑运算符 and / or 一旦不止一个,其运算规则的核心思想就是短路逻辑。好的,那我们就来了解一下短路思想(本人归纳,可能与网上其他人的有些出入,且听我慢慢分析):

表达式从左至右运算,若 or 的左侧逻辑值为 True ,则短路 or 后所有的表达式(不管是 and 还是 or),直接输出 or 左侧表达式 。

表达式从左至右运算,若 and 的左侧逻辑值为 False ,则短路其后所有 and 表达式,直到有 or 出现,输出 and 左侧表达式到 or 的左侧,参与接下来的逻辑运算。

若 or 的左侧为 False ,或者 and 的左侧为 True 则不能使用短路逻辑。

  可能有点抽象,没关系,我们接下来就举一些例子。

  这里有一个巧妙的方法,能让我们直观地了解 python 处理这些逻辑语句时的短路情况(我也是跟别人学的)

  好了,就让我们从简单的开始,假设全是 and 语句 或者全是 or 语句:

example 1

	1>	def a():
2> print 'A'
3> return []
4> def b():
5> print 'B'
6> return []
7> def c():
8> print 'C'
9> return 1
10> def d():
11> print 'D'
12> return []
13> def e():
14> print 'E'
15> return 1
16>
17> if a() and b() and c() and d() and e():
18> print 'ok' #显示结果如下
A

  a() 为假 ,其后均为 and 语句,全部短路,最终只返回 a() 的表达式。记住,所有被短路的表达式均不会被输出。所以,此处仅仅打印 A 。

example 2

	1>	def a():
2> print 'A'
3> return 1
4> def b():
5> print 'B'
6> return 1
7> def c():
8> print 'C'
9> return []
10> def d():
11> print 'D'
12> return []
13> def e():
14> print 'E'
15> return 1
16>
17> if a() and b() and c() and d() and e():
18> print 'ok' #显示结果如下
A
B
C

  python 从左至右先执行 a() ,a() 返回的逻辑值为 True,后面是 and 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() and b() 输出 b() 的逻辑值 True,接着与 c() 进行逻辑运算,b() and c() 输出 c() 的逻辑值 False,而其后均为 and 语句, 则全部短路,最终只打印了 A B C 。

example 3

	1>	def a():
2> print 'A'
3> return 1
4> def b():
5> print 'B'
6> return []
7> def c():
8> print 'C'
9> return 1
10> def d():
11> print 'D'
12> return []
13> def e():
14> print 'E'
15> return 1
16>
17> if a() or b() or c() or d() or e():
18> print 'ok' #显示结果如下
A
ok

  a() 的逻辑值为 True ,其后均为 or 语句,全部短路,最终只打印了 A,而 if 语句为 True ,所以还要打印一个 ok。

example 4

	1>	def a():
2> print 'A'
3> return []
4> def b():
5> print 'B'
6> return []
7> def c():
8> print 'C'
9> return 1
10> def d():
11> print 'D'
12> return []
13> def e():
14> print 'E'
15> return 1
16>
17> if a() or b() or c() or d() or e():
18> print 'ok' #显示结果如下
A
B
C
ok

  python 从左至右先执行 a() ,a() 返回的逻辑值为 False,后面是 or 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() or b() 输出 b() 的逻辑值 False,接着与 c() 进行逻辑运算,b() or c() 输出 c() 的逻辑值 True,而其后为 or 语句, 则全部短路,最终只打印了 A B C ok。


  下面我们就来讲一下 and 与 or 语句同时存在的情况:

example 5

	1>	def a():
2> print 'A'
3> return []
4> def b():
5> print 'B'
6> return []
7> def c():
8> print 'C'
9> return 1
10> def d():
11> print 'D'
12> return []
13> def e():
14> print 'E'
15> return 1
16> def f():
17> print 'F'
18> return 1
19> def g():
20> print 'G'
21> return []
22> def h():
23> print 'H'
24> return 1
25>
26> if a() and b() and c() and d() or e() and f() or g() and h():
27> print 'ok' #输出结果如下:
A
E
F
ok

  别以为语句很长就很难,我们好好分析一下,从左至右,首先a() 的逻辑值为 False,其后到 or 语句为止有三个 and 语句: a() and b() and c() and d(),均被短路。只输出 a(), 得到 a() or e() 为True,输出 e() ,得 e() and F() 为 True ,输出 f(), 其后接 or 语句,则短路其后所有。最终只打印了A E F ok 。(结合我总结的短路逻辑的三点好好理解,应该没问题。

3. 三元运算操作符

  在python2.5 之前,python 是没有三元操作符的,Guido Van Rossum 认为它并不能帮助 python 更加简洁,但是那些习惯了 c 、 c++ 和 java 编程的程序员却尝试着用 and 或者 or 来模拟出三元操作符,而这利用的就是python的短路逻辑。

  三元运算操作符 bool ? a : b ,若 bool 为真则 a ,否则为 b 。

  转化为 python 语言为:

        **bool and a or b **

  如何理解呢? 首先 a , b 都为真,这是默认的。如果 bool 为真, 则 bool and a 为真,输出 a ,短路 b 。如果 bool 为假,短路 a,直接 bool or b ,输出 b 。

  换一种更简单的写法:

        return a if bool else b


本文参考资料(在此表示感谢!):

[Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑 

python的“短路”效应

Python 里 and、or 的计算规则是怎样的?

python and与or

深入Python(3): and、or以及and-or

python 短路逻辑和条件表达式

python中 and 和 or 运算的核心思想 ——— 短路逻辑的更多相关文章

  1. python中实现三目运算

    python中没有其他语言中的三元表达式,不过有类似的实现方法 如: a = 1 b =2 k = 3 if a>b else 4 上面的代码就是python中实现三目运算的一个小demo, 如 ...

  2. Python中 and or 运算顺序详解 --- 短路逻辑

    核心思想 表达式从左至右运算,若 or 的左侧逻辑值为 True ,则短路 or 后所有的表达式(不管是 and 还是 or),直接输出 or 左侧表达式 . 表达式从左至右运算,若 and 的左侧逻 ...

  3. python中的3目运算(3元表达式)

    js中   ret  = 1 == 1 ? 'true' : 'false' python中   ret = 'true' if 1==1 else 'false'

  4. Python中的取模运算

    C++中的取模运算符%只能对整数使用(如果要对浮点数使用需要fmod),Python则不同,对整数或浮点数均有效. 在这里再介绍一下取模的定义:假设a,b两个数,那么a mod b = a - n*b ...

  5. python中的list的*运算使用过程中遇到的问题

    目的: 想生成一个[[],[],[]] 这样的列表, 所以就 [[]]*3 这样做了,但是这样做会有问题,这样list中的三个list其实是同一个list. 例如:a=[[]]*3,然后a[0].ap ...

  6. python相关的编码,运算

    一 字符串的格式化 python中使用占位符%来实现. name=input('name:') age=input('age:') hobby=input('hobby:') print('%s的年龄 ...

  7. 8.python中的数字

    python中数字对象的创建如下, a = 123 b = 1.23 c = 1+1j 可以直接输入数字,然后赋值给变量. 同样也可是使用类的方式: a = int(123) b = float(1. ...

  8. Python中的算数运算符

    算数运算符 计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备 目标 算术运算符的基本使用 01. 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理 ...

  9. python中的位运算符

    按位运算符是把数字看作二进制来进行计算的.Python中的按位运算法则如下,下表中变量 a 为 60,b 为 13,二进制格式如下: a = 0011 1100 b = 0000 1101 ----- ...

随机推荐

  1. 二维指针*(void **)的研究(uC/OS-II案例) 《转载》

    uC/OS-II内存管理函数内最难理解的部分就是二维指针,本文以图文并茂的方式对二维指针进行了详细分析与讲解.看完本文,相信对C里面指针的概念又会有进一步的认识. 一.OSMemCreate( ) 函 ...

  2. 网站卡死,照惯例运行.bat批量处理文件进行重启不起作用

    网站卡死,照惯例运行.bat批量处理文件进行重启不起作用,进入虚拟机控制台进行虚拟机重启仍然不起作用,通过ping分析物理服务器能ping通,各个虚拟机之前也能ping通,但是不能ping通外部,分析 ...

  3. 根据SVN的MESSAGE进行多版本输出,反向排序,真是曲折~~~啊

    import os,sys,time file = open('svnlog') revList = [] tempList = [] linen = 1 for line in file: if ( ...

  4. Altium Designer BGA扇出,原理图中PCB的类和布线规则设置

    本帖隐藏的内容 第一,Altium Designer 认识了这么久,没有用过他的自动扇出功能,今天一试,效果还算不错,不过现在还没有找到不扇出没有网络的引脚的方法,我现在讲我的自动扇出步骤给大家说一下 ...

  5. .NET中 DAL+IDAL+Model+BLL+Web是什么意思

    在.NET中 DAL+IDAL+Model+BLL+Web是什么意思 http://hi.baidu.com/hexiaojian/item/8d0c1a8e648546d75e0ec1e7 其实三层 ...

  6. 修改xcode代码风格设置

    1.找到文件:/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/S ...

  7. c语言枚举型常量

    #include <stdio.h> //代表百度工程师的级别 enum level { //如果没有指定初始的值 那么c语言会自动分配一个编号 整数编号 T14=,T13=,T12=,T ...

  8. 基于PCA的特征提取

    图像处理方面的知识也学了一段时间了,总是光看理论的话,感觉联系不上实际,第一次把理论综合的实现出来,对这些理论的印象才感觉的更深刻,也能够为后续的学习打下良好的基础. PCA是比较老的算法,但是可靠性 ...

  9. StroyBoard中UICollectionView中添加Header和footer

    到Storyboard中,选择collection view controller中的"Collection View".在Attributes inspector中,选择&quo ...

  10. [Javascript] Task queue & Event loop.

    Javascript with Chorme v8 engine works like this : For Chorme engine, v8, it has call stack. And all ...