‘# #python短路原則’
python中 and 和 or 運算的核心思想 ——— 短路邏輯
- 包含一個邏輯運算符
首先從基本的概念着手,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
轉載出處-- https://www.cnblogs.com/an9wer/p/5475551.html