天天看點

《Python資料科學實踐指南》——2.4 流程控制

本節書摘來自華章計算機《python資料科學實踐指南》一書中的第2章,第2.4節,作者 紀路,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

到目前為止,我們所編寫的程式都是線性的程式,程式中的語句按照順序依次被執行,這樣的程式能實作的功能非常有限,而且還需要編寫大量的代碼,損失了編寫程式執行任務的大部分優勢。事實上,可以使用條件判斷及循環這兩種常用的方式更有效率地編寫程式。

帶有條件判斷的程式又稱為“分支程式”,這樣的程式由如三個部分構成。

《Python資料科學實踐指南》——2.4 流程控制

這樣的代碼可以執行某些規則的比較,比如下面這段程式:

我們在性别分别為男或女時列印出不同的代詞,當然也可以做數學運算,比如使用取模的方式x % 2 == 0來判斷奇偶。還記得嗎?“==”代表的是比較,求值之後的結果是布爾型的true或false,而“=”代表的是指派,不要搞混這兩個概念。

python中另外一個重要的概念就是縮進。python不像其他語言使用“;”或“{”、“}”來分割代碼塊,python隻使用一個縮進來區分文法塊,比如上面代碼中的第二行及第四行。雖然很多人對這種方式頗有微詞,但是縮進處理的方法有一個好處,代碼在視覺上和邏輯上的結構是完全一緻的。比如下面這一段c代碼:

這段代碼是完全正确的,但是讀者能夠很輕易地區分出這段代碼中的兩個if是在同一個邏輯層級還是在不同的邏輯層級上。在python中正确的縮進應該是像下面這樣的:

這樣閱讀代碼的時候邏輯确實更加清晰了。除了簡單的if...else...語句之外,還有一個關鍵字“elif”,這個關鍵字是“else if”的縮寫,我們可以寫一個更加複雜的條件判斷語句:

在上面的程式中,elif語句的後面還可以寫一個條件判斷語句。需要注意的一點是,若elif語句之前的某個if或elif語句不成立, 就不會繼續執行下去了,是以條件判斷的順序很重要。

雖然條件判斷語句增強了我們編寫程式的能力,但還有一個大問題需要解決,那就是如何讓電腦任勞任怨地做我們為其安排的工作,這将會涉及2.2.2節将要介紹的流程控制方法。

python中的循環分為兩種,讓我們先從讀者可能比較熟悉的while循環說起。與條件判斷語句類似,while循環也是由條件判斷語句和代碼塊構成的,示例代碼如下:

上面的代碼是計算5 * 10這個語句的複雜寫法,先不要糾結這些細節,讓我們來看看while循環需要哪些東西。這段程式的本質是将10個5加起來,是以需要循環10次,這一點可以從iters這個變量中确認,而變量ans則用于存儲相加的總和。iters > 0是條件判斷語句,當這個語句的結果為false時,這個循環就會終止。而程式塊中一定要有一個語句用于減少iters的值,即iters -= 1這個語句,以保證循環最終會停止。我們可以在紙上手工計算這個程式,每一次疊代之後ans的值應該是:5,10,15,20,25,30,35,40,45,50。

如果忘記了增加iters -= 1會怎麼樣呢?結果就是這個程式永遠都不會終止,直到整數溢出錯誤發生,是以請一定要多加注意。

python的第二個循環方式是for循環,與其他程式設計語言一樣,for循環是一種比while更簡便的表達方式。雖然用while循環可以實作所有的循環,但是如果類似iters -= 1這樣的語句忘記寫了,或者寫錯了,就會發生死循環。而for循環在很多時候都能避免此類的情況發生,因為for循環實作的出發點就是循環次數是已知的。下面來看一個計算乘法的for循環版本:

這個程式中range()函數可以生成一個數列,遵循左閉右開的規則從0至9,讓我們使用for循環列印出來檢視一下:

在for循環中,in後面一定是一個序列,然後在每一次循環中序列中的值都會依次指派給iters,直到序列的最後一個值循環終止時為止。與序列的分片一樣,range可以傳入start、end、step三個參數,比如:

上面的程式會生成一個從5起始,到50終止,步長為5的序列。如果要生成的序列過長,可以使用xrange()函數代替range()函數,xrange()函數是range()函數的生成器版本,可以在序列很長的時候節約記憶體。

與其他語言一樣,python的兩種循環都支援continue和break語句,比如:

在上面的程式中,第一個if中的continue會在ans能在被3整除的時候跳過目前這個循環,是以可以發現在輸出結果中3、6和9不見了。而第二個if語句在使用break語句時如果ans大于10就會跳過整個循環程式塊,即使循環次數沒有達到100次也會跳出。

python中不需要用“;”和“{}”來對代碼塊進行分割,而是使用縮進來進行分割。有些初學者在使用文本編輯器時往往沒有注意空格縮進與tab的差別,導緻程式執行出錯,這是需要注意的。而且一旦決定分隔符的空格數就要一直使用相同的空格數作為縮進,通常來說,python官方建議使用4個空格作為分隔符。不幸的是,sublime text 3的預設分割符是tab,讀者可以嘗試在performance>settings-user打開的檔案中插入兩行,以確定換行之後自動插入4個空格的縮進:

在python中,空白行是沒有任何意義的,用來保證美觀即可。通常來說,邏輯上無關的程式塊之間需要用兩個空行進行分割。注釋同樣沒有意義,通常以“#”開頭。多行注釋可以用來進行大段的描述,使用三引号進行表達,下面就列出幾種常見的python注釋。

單行注釋:

多行注釋: