zoukankan      html  css  js  c++  java
  • python中 and 和 or 运算的核心思想 ——— 短路逻辑

    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 短路逻辑和条件表达式

  • 相关阅读:
    在平面中,一个点绕任意点旋转θ度后的点的坐标
    消息队列
    通过注册表修改默认打开方式
    Beagleboneblack的MLO文件干了些啥
    input子系统 KeyPad-Touch上报数据格式与机制
    字符编码
    find命令之exec
    Jmeter(一)-Linux上的安装和使用
    for循环删除linkedlist中的元素。。。。。。
    Java中组装String字符串常用的几种防范
  • 原文地址:https://www.cnblogs.com/an9wer/p/5475551.html
Copyright © 2011-2022 走看看