python的布尔类型用于什么运算_python布尔类型和逻辑运算

布尔类型

python中True表示真,False表示假,它们是布尔类型:

>>> type(True)

在python中,bool的True和False是数值1和0的字符串表示格式,实际上bool类型是int类型的一个子类。

>>> bool.__bases__

(,)

因为True/False是数值1和0的另一种表示方式,它们可以直接参与数值运算。

>>> True + 2

3

>>> False + 2 - 1

1

True/False的各种形式

虽然True代表1,False代表0。但实际上,python中的任何一个数据对象要么是True,要么是False,所以可以直接在布尔测试的表达式中使用,而并非一定要去大小比较、通过函数测试等等。比如:

if "a":

while 1:

可以通过bool()函数来测试数据对象、表达式是True还是False。例如:

>>> bool(0)

False

>>> bool(1)

True

>>> bool('a')

True

>>> bool('')

False

那么,哪些类型的数据是True,哪些类型的数据是False?

整数值0、浮点数值0.0等、空字符串都为假

None为假

空数据对象都是假,比如[]、{}、()等

注意,元组的括号和逗号的特殊性。例如(())、(None)、(1)这些都不是元组,而是单个数据对象,加上逗号才算是元组。所以,使用括号包围但却不是元组的数据,如果它们是假,则整个返回假,而不是元组看上去不为空而返回真

以下是各种内置数据类型的一些真、假示例:

True False

----------------------------------

number: 1、1.1 0、0.0

string: 'a' ''

None: None

list: ['a']、[1] []

[0]、['']、[None]

Set/Dict: {'a'} {}

tuple: ('a')、(1) ()、('')、(0)、(None)

看几个示例:

>>> bool(1), bool(0)

(True, False)

>>> bool('a'), bool('')

(True, False)

>>> bool(None)

False

>>> bool(['a']), bool([1]), bool([]), bool(['']), bool([()])

(True, True, False, True, True)

>>> bool({'a'}), bool({}), bool({''})

(True, False, True)

>>> bool(('a')), bool(()), bool(('')), bool((0)), bool(({}))

(True, False, False, False, False)

>>> bool(((),)),bool((None,))

(True, True)

实际上,一个数据对象是真还是假,是根据这个类型的__bool__()的返回值(为False则为假)以及__len__()的返回值(为0则为假)来决定的。

None

None为假,它不是表示对象为空,也不是表示对象未定义。它自身就是一个实实在在的数据对象,在内存中有自己的内存地址,而且整个python全局只有一个唯一的None对象。可以认为,None是一种特殊的数据对象,像数值1、字符串'a'一样,只不过内存中这个数据对象里面存储的数据是我们不得而知的,但它永远表示为False。

>>> a = None

>>> b = None

>>> a is b

True

在Python中,没有显式定义return语句的函数、方法并不意味着没有返回值,它们的默认返回值是None。比如print()函数:

>>> a=print("aa")

aa

>>> print(a)

None

None有时候有些小技巧。比如,访问或设置超出列表长度的元素时会报错:

>>> S = []

>>> S[1]

Traceback (most recent call last):

File "", line 1, in

IndexError: list index out of range

>>> S[1] = 2

Traceback (most recent call last):

File "", line 1, in

IndexError: list assignment index out of range

但是可以预先将某些数量的None对象填充到列表中去,这样列表就具备了元素,尽管它们都是None对象。

例如,向列表中填充10个None元素:

>>> S = [None] * 10

>>> S

[None, None, None, None, None, None, None, None, None, None]

>>> S[1]

>>> S[1] = 2

>>> S

[None, 2, None, None, None, None, None, None, None, None]

当然,将None换成其它数据也一样可以,比如0,但用None来填充,一看就知道是为了填充而填充的占位符,不是实际要操作的元素。

另外,预先填充并不能限制列表的长度,可以继续向这个列表中append()新元素。

逻辑运算:and、or、not

python中只支持字符形式的and、or、not逻辑运算,不支持符号类型的&&、||、!。

X and Y:X和Y都为真时,返回真

X or Y:X或Y为真,返回真

not X:X真假取反

not优先级很低,所以not a == b等价于not (a == b)

需要注意,and和or会短路运算(即只要能确定真假关系,就立即停止运算),并返回运算的结果(不是返回True/False,而是返回表达式的运算结果)。而not运算是返回True/False的。

例如,and的逻辑运算:

>>> 2 and 3, 3 and 2

(3, 2)

>>> [] and {}

[]

>>> 3 and []

[]

上面第一行and测试,因为and左边的都是True,所以必须得评估and右边的值,那么不管and右边是True还是False,都会返回and右边的值,比如第一行and测试,第三行and测试。第二行and测试中,因为and左边为False,所以直接能确定为False,所以直接短路返回[]。

再看or逻辑运算:

>>> 2 or 3,3 or 2

(2, 3)

>>> [] or 3

3

>>> [] or {}

{}

上面第一行or测试,因为or左边已经能直接确定为True,所以直接短路返回or左边的值。第二行和第三行or测试,因为or左边都为False,所以必须测试右边的,所以不管or右边是True还是False,都返回or右边的值。

再次说明,and、or返回的不是True/False的布尔值,而是逻辑表达式的运算结果。但因为python中只要是数据,要么是True,要么是False,所以and/or/not都可以用于真假测试,只不过and/or还可以在布尔测试的基础上进行赋值操作。

例如,如果变量a为False,就赋值为某个值,否则采用a原有的值。

a = a or "hhhh"

更通用的,变量A取X、Y、Z等表达式中的一个。

A = X or Y

A = X or Y or Z

不仅如此,and/or还能实现if中选择值的功能。例如,下面是等价的:

A = (( X and Y) or Z)

if X:

A = Y

else:

A = Z

当然,这种用and/or实现逻辑的可读性太差,能用if的当然用if。

空、非空测试的建议

经常会遇到要测试数据是否为空。这里的空可能是None、""、[]、{}、()中的一种,建议不要使用len() == 0去测试:

if len(x) == 0:

if not len(x) == 0:

而是直接将数据作为真、假值进行判断:

if x:

if not x:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值