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 短路邏輯和條件表達式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM