布林值與流程控制
日常生活中,我們無時無刻都在面對許多的選擇,要不要吃飯、要吃什麼、要不要睡覺、要不要出去玩..這些選擇都是由一個又一個的邏輯判斷所組成的。程式語言也是一樣,在這個章節,我們來看看在 Python 裡如何進行邏輯判斷,以及使用布林值來進行流程控制。
布林值(Boolean)
「聽說你們台中人常會說『真的假的』,有這回事嗎?」「有嗎?真的假的?」
根據不可考的統計,好像不少台中人都有「真的假的」的口頭禪,程式語言裡面也有「真的」跟「假的」,而且沒有其他的灰色地帶。真假值,又稱為布林值(Boolean),只有兩種可能的值,常用來表示「對」或「錯」、「真」或「假」、「有」或「沒有」等等之類的非黑即白的二元狀態。
在 Python 的真假值就是 True
跟 False
,要注意大小寫,有些程式語言是用小寫的 true
跟 false
。其實布林值跟一般的數字或字串一樣就只是程式語言裡面的兩個值而已,只是剛好這兩個值在邏輯判斷上有特別的意義。如果你試著用 type()
函數來檢查布林值的型別,會發現這兩個都是 bool
:
>>> type(False)
<class 'bool'>
>>> type(True)
<class 'bool'>
但可能比較多人不知道的,在 Python 的布林值其實也是一種「數字」,我們可以用幾個內建的函數證明給大家看:
# 檢查是不是一種 int
>>> isinstance(True, int)
True
這裡的 isinstance()
函數是用來判斷是不是一種 int
,類別以及實體在後面「物件導向」的章節有詳細介紹,現在大家只要先知道 Python 的布林值雖然看起來是 True
跟 False
,但在本質上就是數字。正因為布林值也是數字,也就是說,數字型態能做的操作,例如四則運算,布林值也能做。如果遇到型別轉換的話,True
轉換成數字就是 1
,False
就是 0
,你猜猜看以下這段程式碼會得到什麼結果:
>>> True + True * 2 - False + True
因為布林值本身就是一種數字型態,所以它也支援數字的四則運算,所以上面這段程式碼等同於 1 + 1 x 2 - 0 + 1,結果會得到 4
。我知道這看起來有點怪,你現在知道這背後發生什麼事,你可以選擇不要這樣寫。
跟前面提到的 str
、int
一樣,雖然你也可以拿 bool
這個名字來當一般變數的名稱,像這樣:
bool = "你好"
可以是可以,但別這樣做,不然不知道什麼時候會砸到自己的腳。
沒了,布林值就這麼簡單。就我觀察,很多軟體工程師程式寫久了,個性也變得像布林值一樣「非黑即白」的二元性格,沒有灰色地帶,我大膽推論也可能跟這有關。
型別轉換
數字能轉字串、字串能轉數字,所以其他型別也能轉布林值,只是轉換的結果不一定是你所想像的。我們可以使用內建的 bool()
函數來進行型別轉換。在 Python 大部份的布林型別轉換的結果都是 True
,雖然我們沒辦法列出所有的真值(Truthy Value),因為幾乎等於有無限多個,但我們可反向的列出有限的幾個假值(Falsy Value),利用排除法,假值以外的值就全部都是真值了。
以下這些值在 Python 在做 bool()
型別轉換時會是 False
:
False
本身None
- 數字
0
- 空字串
""
- 空的「容器」
[]
、()
、{}
除此之外的結果都是 True
。
另外,剛剛提到布林值其實也是一種數字,所以我們也可以用 int()
或 float()
函數來把布林值轉換成數字:
>>> int(True)
1
>>> int(False)
0
>>> float(True)
1.0
>>> float(False)
0.0