[17] Python循環語句(四)
1. 概述
我們繼續來看循環語句,主要介紹循環的嵌套和else語句。
- 計算機編程的原理簡要介紹
- 集成開發環境PyCharm
- 變數名、數字、字元串、列表
- 句式、注釋
- 輸入和輸出
- 條件判斷語句
- 循環語句
- 各類數據結構
- 函數
- 模塊和引入
2. 循環的嵌套
所謂循環的嵌套,就是循環裡面再套個循環,具體看這:
for i in sequence1:n for j in sequence2:n # do somethingnnwhile expression1:n while expression2:n # do somethingn
上面第一個是for裡面套一個for,while裡面套一個while,具體操作時,可能有時候for裡面套while,while裡面套for,for裡面套一個for裡面再套一個。循環的嵌套不一定要兩個,也可能像盜夢空間或者俄羅斯娃娃一樣,四個五個循環一個套一個。
那麼嵌套是怎麼運行的呢?為了方便,我這裡用for循環套for循環來舉例。
for i in range(10):n for j in range(3):n print(i, j)n
這個非常好理解,i會取0到9,j會取0到2,每次就像列印坐標一樣,一行一行把i和j的值輸出,運行之後我們會發現一共輸出30行:
0 0n0 1n0 2n1 0n1 1n1 2n2 0n2 1n2 2n...n9 0n9 1n9 2n
左邊一列是i,右邊是j。具體操作如下:
- 進入i的第一次循環,i為0,運行i循環內的代碼;j循環開始,j等於0時輸出i=0、j=0,j等於1時輸出i=0、j=1,j等於2時輸出i=0、j=2;j循環結束,i的第一次循環結束。
- 進入i的第二次循環,i為1,運行i循環內的代碼;j循環開始,j等於0時輸出i=1、j=0,j等於1時輸出i=1、j=1,j等於2時輸出i=1、j=2;j循環結束,i的第二次循環結束。
- 以此類推。
- 進入i的第十個循環,i為9,運行i循環內的代碼;j循環開始,j等於0時輸出i=9、j=0,j等於1時輸出i=9、j=1,j等於2時輸出i=9、j=2;j循環結束,i的第十個循環結束,i循環結束,程序結束。
我們可以看到,i循環管理著j循環,i走一小步,j就要走完所有的步數,當i走第二步的時候,j就要再一次走完所有的步數。很像我們的時鐘,時針每增加1,分針就要從0走一圈。
for hour in range(12):n for minute in range(60):n print("{:02d}:{:02d}".format(hour, minute))n
hour從0走到11,minute從0走到59,時針每往前進一格,分針就要把0到59都輸出一遍,最後結果是這樣,由於有720行我就挑幾個複製粘貼,
00:00n00:01n00:02n00:03n00:04n...n11:55n11:56n11:57n11:58n11:59n
3. 循環中的else語句
這個很好玩,我覺得是Python的特有的,我也很少用到。
while循環中的else語句很好理解:當條件不滿足時,就運行那else裡面的代碼。
ind = 5nwhile ind < 10:n print(ind)n ind += 1nelse:n print(ind, "Goodbye")n
最後輸出5、6、7、8、9、10 Goodbye,也就是說,一開始正常運行while循環,最後當ind等於9那個循環把其值更新為10後,while判斷為誤,如果沒有else語句,循環就結束了,但是現在有了else,我們就直接去else那裡,輸出10 Goodbye。
如果第一行的ind的值改成一個大於等於10的數,比如說88,那麼while後面判斷就為誤,理應直接不運行該循環,但是有else,就像if條件判斷那樣,進入else,輸出88 Goodbye。
for循環中的else語句比較好玩,由於沒了和while一樣的條件判斷,我們就理解其為,當for正常執行完後else便會執行(其實while也可以這麼理解)。
for i in range(5):n print(i)nelse:n print("Goodbye")n
最後結果是0、1、2、3、4、Goodbye。但是這裡我們就會問啊,既然for運行完才看else,為什麼我們不直接把else去掉,最後一行不要縮進了呢?其實我們可以看到剛才我說了一個詞,也就是這個else要循環正常執行完後才能運行,也就是說,如果我們中途終止打斷了循環,塞了一個break,這個循環就被強制拖走,else就不會被執行了。
ind = 5nwhile ind < 10:n print(ind)n ind += 1n if ind > 7:n breaknelse:n print(ind, "Goodbye")nnprint("------------------")nnfor i in range(5):n print(i)n if i > 2:n breaknelse:n print("Goodbye")n
輸出結果裡面沒有任何帶Goodbye的,因為while在ind為7時被打斷,for在i為3時被打斷,而倆else又是各連著while和for的,也屬於循環的一部分,一旦跳出循環,這倆貨也跟著被跳出。
4. 小練習
到現在為止,我們從知道什麼是Python、如何寫Python到各種零散的知識點,包括條件判斷和循環,但是我們還沒有開始一些系統的練習,我想可以開一個小項目,也就是project,不知道該做一個提醒事項還是一個教師評等第系統。
不過在這裡,我們先練習一道題,運用到嵌套和else的知識。
問題:判斷10到19里每個整數是合數還是質數。
思考:首先我們要走10到19里每個數,其實這個叫迭代(iterate),我們至今看到的for循環都是在做迭代,對於每個數,我們要從嘗試2到這個數減1的所有數是否能整除該數(暴力法,其實我感覺到那個數的一半就行,用雙除號//做),比如判斷17的話,就從2開始暴力迭代嘗試到16,用17去除以每個數取余,如果發現能被整除的話,就是合數,輸出它是合數,否則如果暴力嘗試結束也沒結果,我們就知道它是質數。
解答:
# Iterate from 10 to 19nfor num in range(10, 20):n # Try factors from 2 to (num - 1)n for factor in range(2, num - 1):n if num % factor == 0:n print(num, "is a composite number.")n breakn else:n print(num, "is a prime number.")n
我們為什麼要用break?break在if為真,也就是判斷其為合數後,沒必要繼續進行嘗試了,跳出裡面的循環,同時也打斷else的執行,直接回到外面的循環進行下一次迭代判斷接下來一個數。如果裡面的小循環沒有被打斷,也就是break沒有被運行,反過來說沒有一個能整除,那麼小循環順利運行結束,執行else語句,輸出其為質數。
運行結果:
10 is a composite number.n11 is a prime number.n12 is a composite number.n13 is a prime number.n14 is a composite number.n15 is a composite number.n16 is a composite number.n17 is a prime number.n18 is a composite number.n19 is a prime number.n
推薦閱讀:
※我的Live -- 爬蟲從入門到進階
※python數據科學-多變數數據分析
※怎麼寫一個拿得出手的項目?
※Python黑帽編程 3.1 ARP欺騙