布爾類型
python中True表示真,False表示假,它們是布爾類型:1
2>>>?type(True)
在python中,bool的True和False是數值1和0的字符串表示格式,實際上bool類型是int類型的一個子類。1
2>>>?bool.__bases__(,)
因為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?"",?line?1,?in?IndexError:?list?index?out?of?range>>>?S[1]?=?2Traceback?(most?recent?call?last):
File?"",?line?1,?in?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。