天天看點

《樹莓派Python程式設計指南》——3.3 控制程式流程

本節書摘來自華章計算機《樹莓派python程式設計指南》一書中的第3章,第3.3節,作者:(美) alex bradbury ben everard更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

while循環是一種最簡單的循環。隻要結果是布爾類型的任何語句都可以做它的判斷條件,它将會持續循環到條件為假。如果條件始終為真,它将一直循環下去。例如:

《樹莓派Python程式設計指南》——3.3 控制程式流程

但願你還記得第2章的循環體。在條件後面要加上冒号,接下來的一行要有縮進,所有縮進部分都屬于循環體。要在python解釋器中運作這段代碼,輸入print語句之後要按Enter鍵(enter)。用倒退鍵(backspace)删掉自動産生的tab(縮進),然後再按Enter鍵。這是告訴python循環體結束了,你需要執行這段代碼。

這段代碼會陷入死循環,按ctrl+c組合鍵可以終止它。

無論判斷條件選擇的多麼複雜都可以,隻要它的傳回值是真或假就可以了。但為了最終能夠跳出循環,通常需要一個或多個變量以友善在循環内部改變判斷條件。比如說,下面這個猜數字遊戲中的主循環。

《樹莓派Python程式設計指南》——3.3 控制程式流程

注意,如果輸入非數字的字元,這個程式将報錯。後面我們會介紹如何簡單地修複這個問題,但讓我們先來看一下另一種循環。

3.3.1 用循環周遊資料

for循環可以用來周遊資料,它在每次循環中對一個資料進行處理。通常我們在rang(x, y)的幫助下,周遊從x到y的每一個資料。例如,你可以得出一個12倍表:

《樹莓派Python程式設計指南》——3.3 控制程式流程

rang()還有一個參數,可以設定兩個連續數字之間的間隔。例如我們把range(1,13)改成range(2,14,2),它将會隻計算從2到14的所有偶數。我們還可以使用其他線性資料類型(包括字元串)和集合來控制for循環。下列例子都是合法的:

《樹莓派Python程式設計指南》——3.3 控制程式流程

最後一行是一個很好的例子,它展示了使用錯誤的資料類型會有什麼結果。集合和其他類型有點不一樣,因為它沒有順序,隻是一堆資料的集合。下面兩個例子的執行結果是一樣的。

《樹莓派Python程式設計指南》——3.3 控制程式流程

字典有點特别,因為它儲存的不是元素,而是鍵值對。for循環中可以使用它,但必須做些特殊處理:

《樹莓派Python程式設計指南》——3.3 控制程式流程

https://yqfile.alicdn.com/10079f7bfd5c25f39ba1f0ddb18511482a833f8c.png" >

使用集合,你就不能控制循環中通路資料的順序。實際上,如果你期望用for循環順序通路資料,則需要使用線性資料結構,如清單或元組,而不是使用像集合或字典這樣的無序資料結構。

3.3.2 深入了解循環嵌套

程式設計時經常需要同時周遊多種資料,比如下面這個用來找出1到30之間所有素數的程式。

《樹莓派Python程式設計指南》——3.3 控制程式流程

請注意縮進級别,第一個循環體的縮進為一,第二個循環體的縮進為二。這一點非常重要,隻有這樣,python才能了解哪個代碼屬于哪個循環體,以及每個循環體在何處結束。

使用嵌套時要注意,它可能會使程式變慢。上面的例子運作得很快,但如果你試圖計算3000以内的素數(隻需要在第一行的30後面加兩個零),程式運作就會花非常長的時間。不隻是因為外層循環要多循環上千次,每次走進内層循環也需要多執行很多次。你會發現整個程式運作起來很慢(如果你在做這個實驗,記得按ctrl+c組合鍵可以停止它)。幸運的是,我們還可以改進它。試一下這個程式:

《樹莓派Python程式設計指南》——3.3 控制程式流程

首先,使用range(1, 3000, 2)跳過所有的偶數。我們直接省去一半時間。其次,你可能注意到了,在if裡面我們多加了一個break。這會讓我們節約更多時間。我們是在計算素數,是以不用關心每個數的所有約數。一旦發現這個數字是非素數,就可以直接使用break跳出循環,繼續執行下面一行(if is_prime:)。這兩點優化可以使程式運作得更快。

3.3.3 使用if語句控制程式分支

不僅可以使用循環來不斷執行某段代碼,還可以使用分支來控制python程式流,使其根據不同條件,執行不同的代碼。分支由if語句實作。我們已經見過很多次if語句,現在來複習一下。if語句,像while循環一樣,隻需要一個布爾類型的條件。它後面還可以有附加語句如elif(else-if)和else語句。例如:

《樹莓派Python程式設計指南》——3.3 控制程式流程

https://yqfile.alicdn.com/58a6c77e89153811a9560989849c4705cd1d600e.png" >

一個if語句最多隻執行一段代碼,隻要python發現條件為真,就執行該段代碼并結束整個if語句。是以如果在上面的程式中輸入10,它将隻傳回該數字可以被2整除,而不會試下該數字能否被5整除(如果你期望它試一下,就需要寫一個新的if語句而不是用elif)。如果沒有一個條件為真,則執行else後面的代碼段。在其他例子中可以看到,if語句可以不帶elif或else。如果沒有else語句,同時判斷條件也不成立,python就會跳過if語句,不執行其中的任何代碼。

3.3.4 捕獲異常

如果你喜歡嘗試,在前面的例子中試圖輸入過非數字的字元,就會發現程式會報錯。這是因為python不能把任意字元轉換成數字,它不知道該怎麼做了。此時,python就會報出錯誤。目前為止,我們隻是放任它這麼做,然後,就會導緻程式崩潰。

然而,如果你知道某段代碼可能會報出異常,可以告訴python,這樣程式就知道遇到問題時該如何處理。可以參考下面代碼:

《樹莓派Python程式設計指南》——3.3 控制程式流程

https://yqfile.alicdn.com/adef065e4c533cf0d68f4c60eb936c538b53b3d3.png" >

你可以告訴python要處理的錯誤類型,因為python在異常時會輸出錯誤類型。如:

《樹莓派Python程式設計指南》——3.3 控制程式流程

可以看到,這是個valueerror(值錯誤)。是以前一個例子可以改成:

《樹莓派Python程式設計指南》——3.3 控制程式流程

https://yqfile.alicdn.com/cf9589737a8900cd441ba6d8de80d7c539886fc5.png" >

《樹莓派Python程式設計指南》——3.3 控制程式流程

https://yqfile.alicdn.com/c505ea9cf361fd5e11492b721a5d12ddff1e9943.png" >

練習2

試着使用try語句來捕獲由于使用者輸入錯誤導緻的異常,修複本章開始的猜數字遊戲。