第 11 課 · 入門 · 19 分鐘

Python while 迴圈

在條件變化前反覆執行,並知道什麼時候該停下來。

while 條件計數器break 與 continue

豆倉只裝得下兩百份,隊伍卻不管它什麼時候見底。while 迴圈可以盯著餘量,但除了它沒人會去改這個數。哪個條件該結束這一班?

while 迴圈會在條件為真時持續執行。當你事先不知道要重複多少次時,它比 for 更合適。代價是:你必須自己更新條件,否則迴圈永遠不會結束。 你還會用迴圈不變式、受限重試和工作佇列,檢查迴圈是否真的會結束。

條件控制迴圈

每次迭代前,Python 都會檢查條件。條件為真時執行迴圈體;為假時結束迴圈。通常會在迴圈體裡修改計數器,讓條件最終變成假。

count = 3
while count > 0:
    print(count)
    count -= 1
print("Liftoff")

倒計時

break 與 continue

break 會立即離開迴圈。continue 會跳過目前迭代剩下的程式碼,回到條件判斷。兩者都不要濫用,否則迴圈的出口會變得難以追蹤。

n = 0
while n < 6:
    n += 1
    if n == 2:
        continue
    if n == 5:
        break
    print(n)

跳過與停止

用 while 走訪序列

需要手動控制位置時,可以用索引配合 while。每次迭代都要更新索引。如果只是想存取每個元素,for 通常更清楚。

orders = ["latte", "tea", "mocha"]
i = 0
while i < len(orders):
    print(orders[i])
    i += 1

手動迭代

用迴圈不變式解釋總和

每輪開始時,total 是前 i 個價格的總和。迴圈體加上一個價格,再讓 i 加一,於是下一輪開始時這句話仍然成立。寫迴圈前先說清這個不變式;說不清,通常說明迴圈的形狀不對。

prices = [4.5, 3.0, 2.5]
total = 0
i = 0
while i < len(prices):
    total += prices[i]
    i += 1
print(total)
print("processed", i, "of", len(prices))

不變式讓迴圈可以被檢查

給重試設定預算

驗證迴圈既需要成功出口,也需要次數上限。把嘗試次數和值分開記錄;成功就停,預算用完也停。列印停止原因,失敗才不會悄悄消失。

raw_values = ["many", "3", "5"]
attempts = 0
value = None
while attempts < len(raw_values):
    raw = raw_values[attempts]
    attempts += 1
    try:
        value = int(raw)
        break
    except ValueError:
        print("retry after", raw)
print("value", value, "attempts", attempts)

成功或次數用完時停止

一次取一個,排空佇列

while 適合處理會不斷減少的工作。pop() 每次移除一項,列表越來越短,空列表為假,迴圈自然結束。不要在 for 走訪列表時追加元素;要改變工作集合,就顯式移除。

queue = ["latte", "tea", "mocha"]
served = []
while queue:
    order = queue.pop()
    served.append(order)
    print("serving", order)
print("served", served)

每輪移除一項,空列表結束迴圈

本課要點

  • while 在每次迭代前檢查條件。
  • 迴圈體必須讓條件逐步變為假。
  • break 退出迴圈,continue 跳到下一次迭代。
  • 已經有集合可以走訪時,優先用 for。
  • 迴圈不變式說明什麼始終為真;每輪只做一次朝向終點的更新。

常見錯誤

  • 忘記更新計數器,造成死迴圈。
  • 在條件裡用 = 而不是 ==。
  • 把計數器更新寫在迴圈體外面。
  • 只更新總和卻忘了更新索引,迴圈永遠到不了終點。
輪到你

用 while 迴圈把 1 到 5 相加,然後列印總和。

動手試試

改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。

瀏覽器內 Python本機執行 · 無需帳號
首次執行會從 CDN 下載 Pyodide。修改後點擊「執行程式碼」。

練習本課

12 道題,作答後立即看到解釋。

查看 12 道題答案開始練習
← JSON 資料元組與集合 →