Fork me on GitHub

【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

posted @ 2020-11-11 15:36  君乐豹  阅读(3282)  评论(0编辑  收藏  举报
Live2D