機
器
人
while 迴圈
在上一個章節中,我們學習了可以將列表一項一項跑過的 for 迴圈,但是在 Python 中,迴圈可不只 for 迴圈一種。回想一下 for 迴圈的語法,我們必須先有一個列表,像是:
names = ["Bob", "Amy", "Dan"]
for name in names:
print(name)
或是我們要事先知道迴圈執行幾次,接著使用 range()
,像是:
for i in range(0, 5):
print(i)
然而,如果我們今天沒有一個確定的列表,也沒有一個確定的執行次數,那麼我們要怎麼進行迴圈呢?想像一下,假設你要設計一個網站,會不停跳出問題來,直到使用者回答問題為止。既然我們不知道使用者要在問題出現幾次之後才會回答問題,因此迴圈得要能夠一直執行,並且沒有次數限制。
這樣的迴圈,for 就比較不適合使用,因為我們沒有辦法在一開始就確定迴圈執行的總次數。在這種情況下,while 迴圈就派上用場了。
while 迴圈
還記得當初我們學習過的 if 判斷式 嗎?讓我們用簡單的例子來複習一下:
a = 3
if a > 2:
print("a大於2")
else:
print("a不大於2")
if 判斷式後的程式只有在條件為 True 時才會執行,像是在這個例子中,因為 a > 2
的條件為真,因此程式被執行了。while 迴圈與 if 判斷式也有相同的邏輯,讓我們來看看下面這個例子:
a = 5
while a > 0:
print(a)
a -= 2
這段程式的執行結果為:
5
3
1
為什麼呢?讓我們仔細地看看這段程式想要表達什麼吧!在第一行時,我們宣告了一個變數 a,並且將其值定義為 5。接著到了第二行,碰到了 while 迴圈了。回想一下剛剛說的,while 迴圈跟 if 判斷式一樣,只有在條件為 True 時才會執行。對於此時來說,我們的條件是 a > 0
,而 a 等於 5,因此條件符合,程式執行。
進入迴圈後,電腦於螢幕上 print
出了變數 a,也就是 5。到了第四行,a 的值被減 2,因此現在 a 的值等於 3。此時,迴圈執行完了第一次,電腦會繼續嘗試執行第二次迴圈。因為這個迴圈的條件是 a > 0
,而此時 a 等於 3,因此迴圈繼續執行。
電腦於螢幕上 print
出變數 a 後,將 a 的值再度減少 2。現在,a 等於 1。電腦繼續嘗試執行迴圈,發現 a 等於 1,因此 a > 0
的條件為 True,於是電腦印出變數 a,並且將 a 減 2 變成 -1。這圈迴圈執行完了,電腦繼續嘗試執行迴圈。
然而,現在 a 等於 -1,而我們的條件說只有在 a > 0
時才能繼續執行迴圈。因為條件並不符合,電腦便停止執行迴圈。讓我們用下面這張圖來總結一下剛剛的程式:
continue 和 break
跟 for 迴圈 一樣的,while 迴圈中也可以使用 continue
和 break
關鍵字。讓我們再來複習一下:continue
可以讓電腦跳過這次迴圈,直接執行下一次迴圈;break
則是可以使電腦直接結束迴圈。
既然在 for 迴圈時我們已經學習過了 continue
和 break
,在此我們就直接來看看範例程式吧!假設我們要寫一個程式,要求使用者輸入「a」這個字母,如果使用者輸入「a」以外的東西,就繼續提示使用者輸入「a」,直到使用者輸入「a」為止,那麼我們可以這樣做:
while True:
val = input("請輸入字母 a :")
if val == "a":
break
print("你輸入了 a !")
試著執行一下程式,看看會發生什麼事情吧!第一行中的 while True:
確保了這個迴圈會一直無窮地循環下去,直到迴圈中有 break
關鍵字出現,迫使電腦結束迴圈為止。
接著我們來看看這個有關 continue
的例子,我們的目標是從 50 開始,以 7 作為遞減的公差,印出所有大於 0 而且不是 4 的倍數的數。我們可以使用 while 迴圈:
i = 50
while i > 0:
if i % 4 == 0:
continue
print(i)
這樣一來,我們可以得到以下的結果:
50
43
29
22
15
1
while-else
和 for 迴圈 一樣,while 迴圈後也可以加上 else,形成一個 while-else 的結構。
else 中的程式會在 while 迴圈結束之後執行,但是只有在 while 是自然結束的情況下才執行;倘若 while 迴圈是因為 break
而結束,else 中的程式則不會執行。讓我們看看這兩個範例:
i = 5while i > 0:
print(i)
i -= 2
else:
print("迴圈結束")
將會輸出:
5
3
1
迴圈結束
另一個範例:
i = 5
while i > 0:
if i == 1:
break
print(i)
i -= 2
else:
print("迴圈結束")
將會輸出:
5
3
看出差別了嗎?在第一個範例中,迴圈是自然地結束,因此 else 中的程式被執行了,螢幕上印出了「迴圈結束」的字樣。反觀第二個範例,迴圈因為 break
而被迫結束,因此 else 中的程式沒有執行。