分享python中and / or 的運算邏輯實例教學

零下一度
發布: 2017-05-26 11:58:44
原創
2569 人瀏覽過

python中and 和or 運算的核心思想——— 短路邏輯

  最近開始看廖雪峰的python教程,打算先把《learn python the hard way》放一放,因為最後幾章感覺還是有點難度(好吧,是我太弱了,不過慢慢來吧,一步一個腳印),想著看完廖雪峰的教程之後再回過頭來,或許能有些思路。

  好吧,言歸正傳,今天之所以寫這個,就是因為在廖雪峰教程裡filter 一章裡出現了and / or 的運算,之前的教程沒有提到過這個,剛看的時候有些困惑,一頭霧水,程式碼如下:

    #把一个序列中的空字符串删掉

    1>  def not_empty(s):
    2>      return s and s.strip()
    3>
    4>  filter(not_empty, ['A', '', 'B', None, 'C', '  '])
登入後複製

 

  後來在網路上查了一些關於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 後所有的表達式,直接輸出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() 的邏輯值為False ,其後均為and 語句,全部短路,最終返回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
登入後複製

  a() 的邏輯值為True,不能短路其後,與b() 進行邏輯運算,傳回b() 的邏輯值True,與c()進行邏輯運算,傳回c() 的邏輯值False,其後均為and 語句, 則全部短路,最終傳回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() 的表達式。

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
登入後複製

  a() 的邏輯值為True,不能短路其後,與b() 進行邏輯運算,傳回b() 的邏輯值False,與c()進行邏輯運算,傳回c() 的邏輯值True,其後均為or 語句,則全部短路,最終傳回c() 的表達式。

  下面我們就來講一下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() or e() 為True,輸出 e() ,得 e() and F() 為 True ,輸出 f(), 其後接 or 語句,則短路其後所有。 (結合我總結的短路邏輯的三點好好理解,應該沒問題。)

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
登入後複製

【相关推荐】

1. Python and、or以及and-or语法总结

2. 解析python中and与or用法

3. 详细介绍Python中and和or实际用法

4. 总结Python的逻辑运算符and

5. Python:逻辑判断与运算符实例

以上是分享python中and / or 的運算邏輯實例教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!