前一篇文章中,我們學習了如何在 Python 中撰寫流程控制的語法,透過 if、elif 與 else 關鍵字能夠在程式中加入「條件的判斷」,並執行相對應的程式碼。在本篇文章中,我們將延伸流程控制中「條件」的概念,來解釋程式中的「迴圈」(Loop) 。
如果你喜歡透過影片學習:
在前一篇文章中,我們介紹過上篇這張圖。所謂的「流程控制」,就是由「條件」與條件成立時要執行的「任務」所組成。因此,電腦在執行此程式時,會先對條件進行判斷,依照判斷結果執行相對應的程式碼,整個程式才算是執行結束。
假如我們希望電腦在執行此程式時,可以「重複」進行條件的判斷呢?如下圖所示,在執行完相對應程式碼後,程式並沒有結束,而是「重新」回到條件的判斷。
你注意到了嗎?「重複」、「重新」或是「再一次」指的就是「迴圈」(Loop)。在程式的世界中,「迴圈」的概念相當常見,只要我們希望『符合某一條件,就「重複」執行某段程式碼』,就會透過迴圈的概念來實作。
如下方的列表所示,在 Python 與大多數的程式語言中,迴圈的語法通常會透過兩種關鍵字來實現,分別是「while」與「for」。兩種關鍵字所寫出來的迴圈,就稱為「while loop」與「for loop」。
其中,while loop 的觀念就是我們上面對迴圈的介紹,因此我們先從 Python 中的 while loop 語法開始介紹。
我們直接觀察以下的程式碼:
num = 0 while num < 3: print('number: ' + str(num)) num = num + 1
在程式碼中,我們使用了 while 關鍵字,並在關鍵字後方加上條件與冒號,滿足條件的程式碼則是換行並縮排。
下方為此程式的輸出,我們可以發現迴圈中的程式碼總共被執行了三次。
number: 0 number: 1 number: 2
我們必須注意到在上方程式碼中,一定是「先」確定條件成立,「後」執行迴圈內部的程式碼。接著,讓我們深入了解上述程式碼的執行流程:
從上面的執行流程,我們可以清楚觀察到:「迴圈條件」被執行了 4 次;「迴圈內部的程式碼」被執行了 3 次。
接著,我們再透過一個程式範例,熟悉 while loop 的撰寫。下方的程式碼,透過 while loop 計算 1 到 100 的總和:
sum = 0 num = 1 while num <= 100: sum += num num += 1 print(f'sum: {sum}')
下方為程式實際的執行流程:
…
由此我們可以清楚的觀察到 while loop 由 1 加到 100 的過程。
需要特別補充的是最後一行的 print() 函式。除了透過「字串加法」將字串與變數合起來之外,我們也可以透過 f string 的方式將變數插入到字串中。
# 字串加法: print('sum: ' + str(sum)) # f string print(f'sum: {sum}')
當我們使用 f string 的寫法時,需要在字串前方加上 f,並在字串中需要插入變數的地方透過{}將變數包起來。透過 f string 可以更簡單的將字串與變數和在一起。
提到迴圈 (Loop) 的觀念時,break 與 continue 兩個角色一定會被介紹到。
當迴圈的條件成立後,電腦會執行回圈內部的程式碼。我們可以在迴圈內加上 break,當電腦執行到這一行時,就會直接離開迴圈。
sum = 0 num = 1 while num <= 100: sum += num num += 1 break print(f'sum: {sum}')
在上述的程式碼中,最終的 sum 會是 1。因為當電腦第一次進入迴圈後,遇到 break 時,就會馬上離開迴圈。如果直接在迴圈內部的程式碼加上 break 就會失去迴圈「重複」執行的目的。因此,我們通常會透過 if 進行判斷,如果條件滿足,才透過 break 離開迴圈。
sum = 0 num = 1 while num <= 100: sum += num num += 1 if sum > 1000: break print(f'sum: {sum}')
在上面這段程式碼中,我們判斷如果「sum > 1000」才執行 break。
當迴圈的條件成立後,電腦會執行回圈內部的程式碼。我們可以在迴圈內加上 continue,當電腦執行到這一行時,就會直接回到迴圈的條件進行判斷。
sum = 0 num = 1 while num <= 100: sum += num num += 1 print(f'sum: {sum}')
在上面這段程式碼中,每一次迴圈的最後都會將 sum 的數值顯示出來。但是如果我們希望只有當 sum > 4000 時才顯示,我可以透過 continue 直接忽略迴圈內剩下的程式碼,回到迴圈條件判斷的地方:
while num <= 100: sum += num num += 1 if sum < 4000: continue print(f'sum: {sum}')
只要 sum < 4000,電腦就會執行到 continue 這行程式碼,馬上結束這一個迴圈,回到迴圈條件判斷的階段。
這邊需要特別注意的是,break 與 continue 只能寫在迴圈內部,也就是只能用在 while loop 與 for loop 當中。
了解完 while loop 後,我們接著學習 Python 中的 for loop。如下圖所示,while loop 是以「條件」來決定目前的迴圈是否要執行;for loop 則是透過「次數」決定好要執行幾次迴圈。
在 Python 中,我們經常會透過 range() 函式,指定 for loop 要執行的次數。
for num in range(10): print('Hello World')
上方程式碼為 Python 中基本的 for loop 範例。Python 中 for loop 的語法通常由下列元素所組成:
「序列 (Sequence) 或可迭代的物件 (Iterable Object)」這一個名詞實在是看起來很可怕,但是對於初學著的我們而言,我們可以先把它想成「一連串的物件」。如下方列出很多「一連串的物件」:
因此,range(10) 我們可以先把它想成 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (注意是 0 到 9,不是 1 到 10)。for num in range(10) 則變成 for num in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。按照字面上的意思,每一次的迴圈中 num 都會「依序」對應到 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 中的每一個數字。因此,透過 range(10) 指定迴圈總共執行 10 次。
for num in range(10): print(f'num: {num}')
上方程式碼直接將 num 每一次對應到的數字顯示出來。
我們一樣可以在 for loop 中使用 break 與 continue 等關鍵字:
for num in range(10): if num == 5: break print(f'num: {num}')
在上方程式碼中,如果 num 為 5 時,就直接離開迴圈。
接著,我們再透過一個程式範例,熟悉 for loop 的撰寫。下方的程式碼,透過 for loop 計算 1 到 100 的總和:
sum = 0 for num in range(101): sum += num print(f'sum: {sum}')
在上文中,我已經了解到 range() 函式的基礎用法。實際上,range() 函式可以接受 3 個參數,分別表示:
在上文中,我們都只有提供一個參數給 range() 函式,其實我們提供的就是 stop。
range(10)
上方的程式碼中,我們指定 range() 的 stop 參數為 10,相當於:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
如果我們提供 2 個參數給 range(),其實表示的是 start 與 stop:
range(10, 20)
上方程式碼表示 start 為 10,stop 為 20,相當於:
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
必須特別注意的是 stop 的那一個位置,是不會被包含進去的!
當然,range() 最多可以提供 3 個參數,第 3 個參數表示步伐的長度 (step):
range(10, 20, 2)
上方程式碼所建立的序列相當於:
[10, 12, 14, 16, 18]
你可以發現序列中的數字彼此的差為 2。
在本篇文章中,我們學習了迴圈 (Loop) 的觀念,以及如何在 Python 中撰寫 for loop 與 while loop 的語法。此外,我們也學習到迴圈的好朋友「break」與「continue」的作用。在下一篇文章中,我們將會正式學習「函式」(Function) 的概念。