目录
一、绪论
以前看过的一些教程及网上资源对 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 +False1
还有一道经典题 (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 [] andNone
0>>> 1 and '' and {} and () andFalse''
#若 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"", line 1, in
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 or01
#若 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 1False>>> not0
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
xory
布尔"或" - 若 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 "", line 1, in
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
总而言之,对于逻辑运算符的使用,在理解设计和运行原理的前提下,结合圆括号 () 锁定优先级,就不太会出什么岔子了~
参考文献: