python and or not计算_【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 +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

总而言之,对于逻辑运算符的使用,在理解设计和运行原理的前提下,结合圆括号 () 锁定优先级,就不太会出什么岔子了~

参考文献:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值