赞
踩
目录
以前看过的一些教程及网上资源对 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 |
关于 变量/对象 的 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 / 剑指 Offer 经典题 不得不提:
求 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))
'运行
已知 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, 则返回从左到右的最后一值!!!!而不一定返回 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 为空也不会抛出异常
已知 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, 则返回从左到右的最后一值!!!!而不一定返回 False !
- >>> 0 or False # 返回最后一个 False
- False
- >>> '' or {} or () # 返回最后一个 ()
- ()
- >>> 0 or [] or None # 无显式返回 (返回最后一个 None)
not 执行 bool 逻辑运算,只返回 True 或 False,注意区别!
not 运算符用起来简单,若元素的 bool 逻辑值为 True,则 n ot 表达式返回 False;若元素的 bool 逻辑值为 False,则返回 True。一言以蔽之 —— 跟你唱反调...
- # 一目了然, 无需多言
- >>> not 1
- False
- >>> not 0
- True
- >>> not [6,6,6]
- False
- >>> not []
- True
注意,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
总而言之,对于逻辑运算符的使用,在理解设计和运行原理的前提下,结合圆括号 () 锁定优先级,就不太会出什么岔子啦~
参考文献:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。