【Python】詳解 邏輯運算符 (and、or、not) + 布爾邏輯 (bool)


目錄

一、緒論

二、說明

2.1 關於 bool 邏輯值 (十分重要)

2.2 and —— bool “與” 邏輯運算符

2.3 or —— bool “或” 邏輯運算符

2.4 not —— bool “非” 邏輯運算符

2.5 邏輯運算符混用與優先級等問題


一、緒論

以前看過的一些教程及網上資源對 Python 邏輯運算符部分的敘述都很簡單,給出定義加上幾個小例子就完事了。然而,后來才發現事情比想象中的要復雜一些,還是希望整理清楚一些。^  ^

運算符 邏輯表達式 簡要說明
  and     x and y 布爾"與" - 若 x 為 False,x and y 返回 False,否則返回 y 的計算值
   or      x or y 布爾"或" - 若 x 為非 0,則返回 x 的值,否則返回 y 的計算值
  not      not x 布爾"非" - 若 x 為 True,返回 False;若 x 為 False,返回 True

二、說明

2.1 關於 bool 邏輯值 (十分重要)

關於 變量/對象 的 bool 邏輯值,通常僅 0、''、[]、()、{}、None、False (及各種空容器) 為 False,其余均為 True。

對於 類實例,默認為 True,但也可自定義方法使運算值為 False (如 return False)。

關於其他 布爾表達式,則取決於其運算結果的 bool 邏輯。

# 使用 bool() 函數判斷變量/對象、表達式、類實例等的 bool 邏輯值
>>> bool(0)
False
>>> bool('')
False
>>> bool([])
False
>>> bool(())
False
>>> bool({})
False
>>> bool(None)
False
>>> bool(False)
False
 
>>> bool(1>2)
False
>>> bool(1<2)
True
>>> bool(1==2)
False
 
>>> bool(1 is 2)
False
>>> bool(1 is not 2)
True
 
>>> bool(1 in [1, 2])
True
>>> bool(1 not in [1, 2])
False

關於 bool 邏輯表達式,遠不止上述種類,許多 Python 關鍵字的使用都能構造出來。

然而,有一種流行的錯誤說法是:邏輯運算符用於操作 bool 類型的表達式,執行結果也是 bool 類型。事實上,Python 邏輯運算符可用於任何類型的表達式,表達式為 bool 類型只是充分不必要條件;同時,邏輯運算的結果可為任意類型,而不一定是 bool 類型,(注意,准確地說,用於運算的表達式及其結果的 bool 邏輯值是一定為 True 或 False)  例如:

# 只要 bool 邏輯值為 True 或 False 之一, 無論什么類型都能使用邏輯運算符
>>> 1 and 'csgo'
'csgo'
>>> [6,6,6] or [8,8,8]
[6, 6, 6]
>>> not {"C", "T"}
False
# 用於運算的表達式, 其 bool 邏輯值一定為 True 或 False
>>> bool(1)
True
>>> bool('csgo')
True
>>> bool([6,6,6])
True
>>> bool([8,8,8])
True
>>> bool({"C", "T"})
True

此外,還有一些 sao 操作,但沒事不建議這么寫,有興趣可以看一下: 

>>> True == 1    # 就是這么定的, 因為 bool 型是 int 型的一個子類
True
>>> False == 0
True
>>> True + 1     # 就是這么算的 —— bool 值的非 bool 運算
2
>>> True + False
1

還有一道經典題 (LeetCode) 不得不提:

求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case 等關鍵字及條件判斷語句 (A?B:C)。

示例 1:

輸入:  n = 3

輸出:  6

限制:  1 <= n <= 10000

# 利用 bool 值是 int 子類和邏輯運算符的短路特性, 光速解題
def sumNums(self, n: int) -> int:
    return n and (n + sumNums(n-1))

2.2 and —— bool “與” 邏輯運算符

已知 and 雖執行 bool 邏輯運算,但並不總是返回 True 或 False,而是返回用於比較的值之一。

使用 and 時,從左到右 進行邏輯運算 (判定輸出結果)。一旦遇到 bool 邏輯為 False 的值,則 立刻返回該值 且不再往后運算;否則,所有元素的 bool 邏輯值均為 True,and 將返回 最后一個值

為什么是這樣的呢?不難理解,按照 “與” 邏輯 —— “全真才真,一假即假”,為判斷 and 表達式中是否存在 bool 邏輯為 False 的值,需要從左往右遍歷,依次判斷是否有 “假”。一旦遇到 bool 邏輯為 False 的 “假貨”,則返回它 (而不一定返回 False !),相當於宣告了 and 表達式為假,不論后面有什么也無需再往后演算 (短路操作)。如果一直遇到 “真貨” 直至結束,則返回最后一個值 (而不一定返回 True !),相當於宣告了 and 表達式為真。

# 從左到右依次演算, 一旦遇到 bool 為 False 的值, 立即返回之, 不再往后演算
>>> 1 and 0 and [] and None  
0
>>> 1 and '' and {} and () and False
''
# 若 bool 上下文中所有值均為 True, 則返回從左到右的最后一值
>>> 1 and 2   # 返回最后一個 2       
2
>>> 1 and 2 and 3 and 4   # 返回最后一個 4
4

  除了 2.1 節的 LeetCode 題,and 的用處還很多,例如: 判斷一個 list 末端元素是否 >0,由於不確定 list 是否為空,直接下標索引取值可能會引發 error。如果不想多寫個 if 判斷 list 是否非空,可以這么寫:

>>> lst = []
>>> if lst[-1] > 0:
    print("last element > 0")
 
Traceback (most recent call last):
  File "<pyshell#95>", line 1, in <module>
    if lst[-1]>0:
IndexError: list index out of range
 
>>> if lst and lst[-1] > 0:
    print("last element > 0")    # 如此即便 lst 為空也不會拋出異常

2.3 or —— bool “或” 邏輯運算符

已知 or 雖也執行 bool 邏輯運算,但並不總是返回 True 或 False,而是返回用於比較的值之一。

使用 or 時,從左到右 進行邏輯運算 (判定輸出結果)。一旦遇到 bool 邏輯為 True 的值,則 立刻返回該值 且不再往后運算;否則,所有元素的 bool 邏輯值均為 False,or 將返回 最后一個值

為什么這樣呢?同樣不難理解,按照 “或” 邏輯 —— “一真即真,全假才假”,為判斷 or 表達式中是否存在 bool 邏輯為 True 的值,需要從左往右遍歷,依次判斷是否有 “真”。一旦遇到 bool 邏輯為 True 的 “真貨”,則返回它 (而不一定返回 True !),相當於宣告了 or 表達式為真,不論后面有什么也無需再往后演算 (短路操作)。如果一直遇到 “假貨” 直至結束,則返回最后一個值 (而不一定返回 False !),相當於宣告了 or 表達式為假。

# 從左到右依次演算, 一旦遇到 bool 為 True 的值, 立即返回之, 不再往后演算
>>> 1 or 2           
1
>>> 1 or 2 or 3 or 0
1
# 若 bool 上下文中所有值均為 False, 則返回從左到右的最后一值
>>> 0 or False       # 返回最后一個 False
False
>>> '' or {} or ()   # 返回最后一個 ()
()
>>> 0 or [] or None  # 無顯式返回 (返回最后一個 None)

2.4 not —— bool “非” 邏輯運算符

not 執行 bool 邏輯運算,只返回 True 或 False,注意區別!

not 運算符用起來簡單,若元素的 bool 邏輯值為 True,則 not 表達式返回 False;若元素的 bool 邏輯值為 False,則返回 True。一言以蔽之 —— 跟你唱反調...

# 一目了然, 無需多言
>>> not 1
False
>>> not 0
True
>>> not [6,6,6]
False
>>> not []
True

2.5 邏輯運算符混用與優先級等問題

注意,Python 的 bool 邏輯運算符是 and、or、not,而非 &、||、~ (后三者作為二進制位運算的邏輯與、或、非)。

以上說明的 and 及 or 的運算順序都是 從左往右,但這都是在沒有圓括號 “()” 和邏輯運算符混用的前提下的簡單情況。

如果存在更復雜的情況,則存在 運算優先級() > not > and > or

本文將不會給出任何不使用圓括號 () 的混用例子,因為這樣極易造成干擾和混淆,為解讀和修正帶來困擾,你這么寫一定會被人錘死的~ 非要混用,就記住 一定要用圓括號 () 保障優先級和可讀性!

>>> 1 and (2 or 3)  # (2 or 3) 結果為 2 → 1 and 2 結果為 2
2
>>> 4 or (5 and 6)  # (5 and 6) 結果為 6 → 4 or 6 結果為 4
4

通常情況下,邏輯運算符是和比較運算符一起使用的,同樣都用於條件選擇和循環。

# 規范化書寫
>>> (x > 0) and (y > 0)
True
>>> (x == 1) or (y == 1)
True
>>> not (x < 0)
True

總而言之,對於邏輯運算符的使用,在理解設計和運行原理的前提下,結合圓括號 () 鎖定優先級,就不太會出什么岔子了~

 

 

原文:https://blog.csdn.net/qq_39478403/article/details/105654170

 

目錄

一、緒論

二、說明

2.1 關於 bool 邏輯值 (十分重要)

2.2 and —— bool “與” 邏輯運算符

2.3 or —— bool “或” 邏輯運算符

2.4 not —— bool “非” 邏輯運算符

2.5 邏輯運算符混用與優先級等問題


一、緒論

以前看過的一些教程及網上資源對 Python 邏輯運算符部分的敘述都很簡單,給出定義加上幾個小例子就完事了。然而,后來才發現事情比想象中的要復雜一些,還是希望整理清楚一些。^  ^

運算符 邏輯表達式 簡要說明
  and     x and y 布爾"與" - 若 x 為 False,x and y 返回 False,否則返回 y 的計算值
   or      x or y 布爾"或" - 若 x 為非 0,則返回 x 的值,否則返回 y 的計算值
  not      not x 布爾"非" - 若 x 為 True,返回 False;若 x 為 False,返回 True

二、說明

2.1 關於 bool 邏輯值 (十分重要)

關於 變量/對象 的 bool 邏輯值,通常僅 0、''、[]、()、{}、None、False (及各種空容器) 為 False,其余均為 True

對於 類實例,默認為 True,但也可自定義方法使運算值為 False (如 return False)。

關於其他 布爾表達式,則取決於其運算結果的 bool 邏輯。

  1.  
    # 使用 bool() 函數判斷變量/對象、表達式、類實例等的 bool 邏輯值
  2.  
    >>> bool( 0)
  3.  
    False
  4.  
    >>> bool( '')
  5.  
    False
  6.  
    >>> bool([])
  7.  
    False
  8.  
    >>> bool(())
  9.  
    False
  10.  
    >>> bool({})
  11.  
    False
  12.  
    >>> bool( None)
  13.  
    False
  14.  
    >>> bool( False)
  15.  
    False
  16.  
     
  17.  
    >>> bool( 1> 2)
  18.  
    False
  19.  
    >>> bool( 1< 2)
  20.  
    True
  21.  
    >>> bool( 1== 2)
  22.  
    False
  23.  
     
  24.  
    >>> bool( 1 is 2)
  25.  
    False
  26.  
    >>> bool( 1 is not 2)
  27.  
    True
  28.  
     
  29.  
    >>> bool( 1 in [ 1, 2])
  30.  
    True
  31.  
    >>> bool( 1 not in [ 1, 2])
  32.  
    False

關於 bool 邏輯表達式,遠不止上述種類,許多 Python 關鍵字的使用都能構造出來。

然而,有一種流行的錯誤說法是:邏輯運算符用於操作 bool 類型的表達式,執行結果也是 bool 類型。事實上,Python 邏輯運算符可用於任何類型的表達式,表達式為 bool 類型只是充分不必要條件;同時,邏輯運算的結果可為任意類型,而不一定是 bool 類型,(注意,准確地說,用於運算的表達式及其結果的 bool 邏輯值是一定為 True 或 False)  例如:

  1.  
    # 只要 bool 邏輯值為 True 或 False 之一, 無論什么類型都能使用邏輯運算符
  2.  
    >>> 1 and 'csgo'
  3.  
    'csgo'
  4.  
    >>> [ 6, 6, 6] or [ 8, 8, 8]
  5.  
    [ 6, 6, 6]
  6.  
    >>> not { "C", "T"}
  7.  
    False
  8.  
    # 用於運算的表達式, 其 bool 邏輯值一定為 True 或 False
  9.  
    >>> bool( 1)
  10.  
    True
  11.  
    >>> bool( 'csgo')
  12.  
    True
  13.  
    >>> bool([ 6, 6, 6])
  14.  
    True
  15.  
    >>> bool([ 8, 8, 8])
  16.  
    True
  17.  
    >>> bool({ "C", "T"})
  18.  
    True

此外,還有一些 sao 操作,但沒事不建議這么寫,有興趣可以看一下: 

  1.  
    >>> True == 1 # 就是這么定的, 因為 bool 型是 int 型的一個子類
  2.  
    True
  3.  
    >>> False == 0
  4.  
    True
  5.  
    >>> True + 1 # 就是這么算的 —— bool 值的非 bool 運算
  6.  
    2
  7.  
    >>> True + False
  8.  
    1

 還有一道經典題 (LeetCode) 不得不提:

求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case 等關鍵字及條件判斷語句 (A?B:C)。

示例 1:

輸入:  n = 3

輸出:  6

限制:  1 <= n <= 10000

  1.  
    # 利用 bool 值是 int 子類和邏輯運算符的短路特性, 光速解題
  2.  
    def sumNums(self, n: int) -> int:
  3.  
    return n and (n + sumNums(n -1))

2.2 and —— bool “與” 邏輯運算符

已知 and 雖執行 bool 邏輯運算,但並不總是返回 True 或 False,而是返回用於比較的值之一。

使用 and 時,從左到右 進行邏輯運算 (判定輸出結果)。一旦遇到 bool 邏輯為 False 的值,則 立刻返回該值 且不再往后運算;否則,所有元素的 bool 邏輯值均為 True,and 將返回 最后一個值

為什么是這樣的呢?不難理解,按照 “與” 邏輯 —— “全真才真,一假即假”,為判斷 and 表達式中是否存在 bool 邏輯為 False 的值,需要從左往右遍歷,依次判斷是否有 “假”。一旦遇到 bool 邏輯為 False 的 “假貨”,則返回它 (而不一定返回 False !),相當於宣告了 and 表達式為假,不論后面有什么也無需再往后演算 (短路操作)。如果一直遇到 “真貨” 直至結束,則返回最后一個值 (而不一定返回 True !),相當於宣告了 and 表達式為真。

  1.  
    # 從左到右依次演算, 一旦遇到 bool 為 False 的值, 立即返回之, 不再往后演算
  2.  
    >>> 1 and 0 and [] and None
  3.  
    0
  4.  
    >>> 1 and '' and {} and () and False
  5.  
    ''
  6.  
    # 若 bool 上下文中所有值均為 True, 則返回從左到右的最后一值
  7.  
    >>> 1 and 2 # 返回最后一個 2
  8.  
    2
  9.  
    >>> 1 and 2 and 3 and 4 # 返回最后一個 4
  10.  
    4

除了 2.1 節的 LeetCode 題,and 的用處還很多,例如: 判斷一個 list 末端元素是否 >0,由於不確定 list 是否為空,直接下標索引取值可能會引發 error。如果不想多寫個 if 判斷 list 是否非空,可以這么寫:

  1.  
    >>> lst = []
  2.  
    >>> if lst[ -1] > 0:
  3.  
    print( "last element > 0")
  4.  
     
  5.  
    Traceback (most recent call last):
  6.  
    File "<pyshell#95>", line 1, in <module>
  7.  
    if lst[ -1]> 0:
  8.  
    IndexError: list index out of range
  9.  
     
  10.  
    >>> if lst and lst[ -1] > 0:
  11.  
    print( "last element > 0") # 如此即便 lst 為空也不會拋出異常

2.3 or —— bool “或” 邏輯運算符

已知 or 雖也執行 bool 邏輯運算,但並不總是返回 True 或 False,而是返回用於比較的值之一。

使用 or 時,從左到右 進行邏輯運算 (判定輸出結果)。一旦遇到 bool 邏輯為 True 的值,則 立刻返回該值 且不再往后運算;否則,所有元素的 bool 邏輯值均為 False,or 將返回 最后一個值

為什么這樣呢?同樣不難理解,按照 “或” 邏輯 —— “一真即真,全假才假”,為判斷 or 表達式中是否存在 bool 邏輯為 True 的值,需要從左往右遍歷,依次判斷是否有 “真”。一旦遇到 bool 邏輯為 True 的 “真貨”,則返回它 (而不一定返回 True !),相當於宣告了 or 表達式為真,不論后面有什么也無需再往后演算 (短路操作)。如果一直遇到 “假貨” 直至結束,則返回最后一個值 (而不一定返回 False !),相當於宣告了 or 表達式為假。

  1.  
    # 從左到右依次演算, 一旦遇到 bool 為 True 的值, 立即返回之, 不再往后演算
  2.  
    >>> 1 or 2
  3.  
    1
  4.  
    >>> 1 or 2 or 3 or 0
  5.  
    1
  6.  
    # 若 bool 上下文中所有值均為 False, 則返回從左到右的最后一值
  7.  
    >>> 0 or False # 返回最后一個 False
  8.  
    False
  9.  
    >>> '' or {} or () # 返回最后一個 ()
  10.  
    ()
  11.  
    >>> 0 or [] or None # 無顯式返回 (返回最后一個 None)

2.4 not —— bool “非” 邏輯運算符

not 執行 bool 邏輯運算,只返回 True 或 False,注意區別!

not 運算符用起來簡單,若元素的 bool 邏輯值為 True,則 not 表達式返回 False;若元素的 bool 邏輯值為 False,則返回 True。一言以蔽之 —— 跟你唱反調...

  1.  
    # 一目了然, 無需多言
  2.  
    >>> not 1
  3.  
    False
  4.  
    >>> not 0
  5.  
    True
  6.  
    >>> not [ 6, 6, 6]
  7.  
    False
  8.  
    >>> not []
  9.  
    True

2.5 邏輯運算符混用與優先級等問題

注意,Python 的 bool 邏輯運算符是 and、or、not,而非 &、||、~ (后三者作為二進制位運算的邏輯與、或、非)。

以上說明的 and 及 or 的運算順序都是 從左往右,但這都是在沒有圓括號 “()” 和邏輯運算符混用的前提下的簡單情況。

如果存在更復雜的情況,則存在 運算優先級() > not > and > or

本文將不會給出任何不使用圓括號 () 的混用例子,因為這樣極易造成干擾和混淆,為解讀和修正帶來困擾,你這么寫一定會被人錘死的~ 非要混用,就記住 一定要用圓括號 () 保障優先級和可讀性!

  1.  
    >>> 1 and ( 2 or 3) # (2 or 3) 結果為 2 → 1 and 2 結果為 2
  2.  
    2
  3.  
    >>> 4 or ( 5 and 6) # (5 and 6) 結果為 6 → 4 or 6 結果為 4
  4.  
    4

通常情況下,邏輯運算符是和比較運算符一起使用的,同樣都用於條件選擇和循環。

  1.  
    # 規范化書寫
  2.  
    >>> (x > 0) and (y > 0)
  3.  
    True
  4.  
    >>> (x == 1) or (y == 1)
  5.  
    True
  6.  
    >>> not (x < 0)
  7.  
    True

總而言之,對於邏輯運算符的使用,在理解設計和運行原理的前提下,結合圓括號 () 鎖定優先級,就不太會出什么岔子了~


參考文獻:

https://www.runoob.com/python/python-operators.html


免責聲明!

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



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