python中True表示真,False表示假,它们是布尔类型:python
>>> type(True) <class 'bool'>
在python中,bool的True和False是数值1和0的字符串表示格式,实际上bool类型是int类型的一个子类。app
>>> bool.__bases__ (<class 'int'>,)
由于True/False是数值1和0的另外一种表示方式,它们能够直接参与数值运算。函数
>>> True + 2 3 >>> False + 2 - 1 1
虽然True表明1,False表明0。但实际上,python中的任何一个数据对象要么是True,要么是False,因此能够直接在布尔测试的表达式中使用,而并不是必定要去大小比较、经过函数测试等等。好比:测试
if "a": while 1:
能够经过bool()函数来测试数据对象、表达式是True仍是False。例如:code
>>> bool(0) False >>> bool(1) True >>> bool('a') True >>> bool('') False
那么,哪些类型的数据是True,哪些类型的数据是False?对象
[]
、{}
、()
等
(())
、(None)
、(1)
这些都不是元组,而是单个数据对象,加上逗号才算是元组。因此,使用括号包围但却不是元组的数据,若是它们是假,则整个返回假,而不是元组看上去不为空而返回真如下是各类内置数据类型的一些真、假示例:内存
True False ---------------------------------- number: 一、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则为假)来决定的。string
None为假,它不是表示对象为空,也不是表示对象未定义。它自身就是一个实实在在的数据对象,在内存中有本身的内存地址,并且整个python全局只有一个惟一的None对象。能够认为,None是一种特殊的数据对象,像数值一、字符串'a'同样,只不过内存中这个数据对象里面存储的数据是咱们不得而知的,但它永远表示为False。ast
>>> 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 "<stdin>", line 1, in <module> IndexError: list index out of range >>> S[1] = 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> 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()新元素。
python中只支持字符形式的and、or、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: