【Python】详解 逻辑运算符 (and、or、not) + 布尔逻辑 (bool)
目录
一、绪论
以前看过的一些教程及网上资源对 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
目录
一、绪论
以前看过的一些教程及网上资源对 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 逻辑表达式,远不止上述种类,许多 Python 关键字的使用都能构造出来。
然而,有一种流行的错误说法是:逻辑运算符用于操作 bool 类型的表达式,执行结果也是 bool 类型。事实上,Python 逻辑运算符可用于任何类型的表达式,表达式为 bool 类型只是充分不必要条件;同时,逻辑运算的结果可为任意类型,而不一定是 bool 类型,(注意,准确地说,用于运算的表达式及其结果的 bool 逻辑值是一定为 True 或 False) 例如:
此外,还有一些 sao 操作,但没事不建议这么写,有兴趣可以看一下:
还有一道经典题 (LeetCode) 不得不提:
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 (A?B:C)。
示例 1:
输入: n = 3
输出: 6
限制: 1 <= n <= 10000
2.2 and —— bool “与” 逻辑运算符
已知 and 虽执行 bool 逻辑运算,但并不总是返回 True 或 False,而是返回用于比较的值之一。
使用 and 时,从左到右 进行逻辑运算 (判定输出结果)。一旦遇到 bool 逻辑为 False 的值,则 立刻返回该值 且不再往后运算;否则,所有元素的 bool 逻辑值均为 True,and 将返回 最后一个值。
为什么是这样的呢?不难理解,按照 “与” 逻辑 —— “全真才真,一假即假”,为判断 and 表达式中是否存在 bool 逻辑为 False 的值,需要从左往右遍历,依次判断是否有 “假”。一旦遇到 bool 逻辑为 False 的 “假货”,则返回它 (而不一定返回 False !),相当于宣告了 and 表达式为假,不论后面有什么也无需再往后演算 (短路操作)。如果一直遇到 “真货” 直至结束,则返回最后一个值 (而不一定返回 True !),相当于宣告了 and 表达式为真。
除了 2.1 节的 LeetCode 题,and 的用处还很多,例如: 判断一个 list 末端元素是否 >0,由于不确定 list 是否为空,直接下标索引取值可能会引发 error。如果不想多写个 if 判断 list 是否非空,可以这么写:
2.3 or —— bool “或” 逻辑运算符
已知 or 虽也执行 bool 逻辑运算,但并不总是返回 True 或 False,而是返回用于比较的值之一。
使用 or 时,从左到右 进行逻辑运算 (判定输出结果)。一旦遇到 bool 逻辑为 True 的值,则 立刻返回该值 且不再往后运算;否则,所有元素的 bool 逻辑值均为 False,or 将返回 最后一个值。
为什么这样呢?同样不难理解,按照 “或” 逻辑 —— “一真即真,全假才假”,为判断 or 表达式中是否存在 bool 逻辑为 True 的值,需要从左往右遍历,依次判断是否有 “真”。一旦遇到 bool 逻辑为 True 的 “真货”,则返回它 (而不一定返回 True !),相当于宣告了 or 表达式为真,不论后面有什么也无需再往后演算 (短路操作)。如果一直遇到 “假货” 直至结束,则返回最后一个值 (而不一定返回 False !),相当于宣告了 or 表达式为假。
2.4 not —— bool “非” 逻辑运算符
not 执行 bool 逻辑运算,只返回 True 或 False,注意区别!
not 运算符用起来简单,若元素的 bool 逻辑值为 True,则 not 表达式返回 False;若元素的 bool 逻辑值为 False,则返回 True。一言以蔽之 —— 跟你唱反调...
2.5 逻辑运算符混用与优先级等问题
注意,Python 的 bool 逻辑运算符是 and、or、not,而非 &、||、~ (后三者作为二进制位运算的逻辑与、或、非)。
以上说明的 and 及 or 的运算顺序都是 从左往右,但这都是在没有圆括号 “()” 和逻辑运算符混用的前提下的简单情况。
如果存在更复杂的情况,则存在 运算优先级:() > not > and > or
本文将不会给出任何不使用圆括号 () 的混用例子,因为这样极易造成干扰和混淆,为解读和修正带来困扰,你这么写一定会被人锤死的~ 非要混用,就记住 一定要用圆括号 () 保障优先级和可读性!
通常情况下,逻辑运算符是和比较运算符一起使用的,同样都用于条件选择和循环。
总而言之,对于逻辑运算符的使用,在理解设计和运行原理的前提下,结合圆括号 () 锁定优先级,就不太会出什么岔子了~
参考文献: