布尔类型
python中True表示真,False表示假,它们是布尔类型:
1 2>>> type(True)<class 'bool'>
在python中,bool的True和False是数值1和0的字符串表示格式,实际上bool类型是int类型的一个子类。
1 2>>> bool.__bases__(<class 'int'>,)
因为True/False是数值1和0的另一种表示方式,它们可以直接参与数值运算。
1 2 3 4>>> True + 23>>> False + 2 - 11
True/False的各种形式
虽然True代表1,False代表0。但实际上,python中的任何一个数据对象要么是True,要么是False,所以可以直接在布尔测试的表达式中使用,而并非一定要去大小比较、通过函数测试等等。比如:
1 2if "a":while 1:
可以通过bool()函数来测试数据对象、表达式是True还是False。例如:
1 2 3 4 5 6 7 8>>> bool(0) False>>> bool(1) True>>> bool('a') True>>> bool('') False
那么,哪些类型的数据是True,哪些类型的数据是False?
整数值0、浮点数值0.0等、空字符串都为假
None为假
空数据对象都是假,比如
[]
、{}
、()
等元组比较特殊,如果元组中有元素,但全是为假的元素,则也为假
以下是各种内置数据类型的一些真、假示例:
1 2 3 4 5 6 7 8 9 True False ----------------------------------number: 1、1.1 0、0.0string: 'a' ''None: Nonelist: ['a']、[1] [] [0]、['']、[None] Set/Dict: {'a'} {}tuple: ('a')、(1) ()、('')、(0)、(None)
看几个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17>>> 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)
None
None为假,它不是表示对象为空,也不是表示对象未定义。它自身就是一个实实在在的数据对象,在内存中有自己的内存地址。可以认为,None是一种特殊的数据对象,像数值1、字符串'a'一样,只不过内存中这个数据对象里面存储的数据是我们不得而知的,但它永远表示为False。
在Python中,没有显式定义return语句的函数、方法并不意味着没有返回值,它们的默认返回值是None。比如print()函数:
1 2 3 4>>> a=print("aa")aa>>> print(a)None
None有时候有些小技巧。比如,访问或设置超出列表长度的元素时会报错:
1 2 3 4 5 6 7 8 9>>> S = []>>> S[1] Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range>>> S[1] = 2Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list assignment index out of range
但是可以预先将某些数量的None对象填充到列表中去,这样列表就具备了元素,尽管它们都是None对象。
例如,向列表中填充10个None元素:
1 2 3 4 5 6 7>>> 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真假取反
需要注意,and和or会短路运算(即只要能确定真假关系,就立即停止运算),并返回运算的结果(不是返回True/False,而是返回表达式的运算结果)。而not运算是返回True/False的。
例如,and的逻辑运算:
1 2 3 4 5 6>>> 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逻辑运算:
1 2 3 4 5 6>>> 2 or 3,3 or 2(2, 3)>>> [] or 33>>> [] 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等表达式中的一个。
1 2A = X or YA = X or Y or Z
不仅如此,and/or还能实现if中选择值的功能。例如,下面是等价的:
1 2 3 4 5 6A = (( X and Y) or Z)if X: A = Yelse: A = Z
当然,这种用and/or实现逻辑的可读性太差,能用if的当然用if。
转载请注明出处:https://www.cnblogs.com/f-ck-need-u/p/10124444.html
共同学习,写下你的评论
评论加载中...
作者其他优质文章