豆倉只裝得下兩百份,隊伍卻不管它什麼時候見底。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 執行時,可能需要幾秒鐘。
練習本課
12 道題,作答後立即看到解釋。