這裡的範例是可在 Python 3 執行的獨立小程式;輸出框是預先核對的結果。題庫作答時,請保留題目提供的 solve 與參數,使用 return 交回答案。模組章的雙檔範例會另外標明操作方式。
01|先檢查,再執行
while 條件成立時就執行區塊,執行完重新檢查條件。如果一開始就是假,區塊一次也不會執行。寫 while 前先回答:現在狀態是什麼、什麼時候繼續、每輪會改變什麼?
remaining = 3
while remaining > 0:
print(remaining)
remaining -= 1
print("完成")3 2 1 完成
02|追蹤狀態,看見停止的原因
下面每輪增加已存金額與天數;餘額達到目標後停止。第一輪前是 0 元、0 天,第一輪後是 30 元、1 天。把每一輪的值寫成小表格,就能看出第幾輪會越過門檻。
saved = 0
days = 0
target = 100
while saved < target:
saved += 30
days += 1
print(days, saved)4 120
03|while 也能走訪清單
for 比較適合逐一讀取整份清單;while 適合需要自行控制位置或停止條件的情況。以索引走訪時,要先確認 index < len(items),再讀 items[index],避免走到清單外面。
values = [4, 7, 0, 9]
index = 0
total = 0
while index < len(values) and values[index] != 0:
total += values[index]
index += 1
print(total)
print(index)11 2
04|逐步縮小問題
有些處理會讓資料每輪變小。例如非負整數除以 10 的整數商,可以去掉最右邊一位。確認狀態每輪都向停止條件靠近,比單純期待迴圈會停更可靠。
number = 472
digits = []
while number > 0:
digits.append(number % 10)
number //= 10
print(digits)[2, 7, 4]
05|break 的停止條件要能說清楚
while True 表示條件本身永遠成立,因此一定要有可達到的 break。入門時能用明確條件就先用明確條件;需要在區塊中途停止時,再使用 break。
attempt = 0
while True:
attempt += 1
if attempt == 3:
break
print(f"第 {attempt} 次嘗試")
print("停止在", attempt)第 1 次嘗試 第 2 次嘗試 停止在 3
06|continue 前別漏掉更新
continue 會跳過本輪剩下的程式。若計數更新放在 continue 後面,某些情況可能一直停在同一個數字。下例先更新 number,再檢查是否略過,確保每輪都前進。
number = 0
odds = []
while number < 5:
number += 1
if number % 2 == 0:
continue
odds.append(number)
print(odds)[1, 3, 5]
WHEN SOMETHING GOES WRONG
遇到錯誤,先檢查這裡
狀態沒有更新,形成無限迴圈
找出條件裡的變數,檢查所有可能的分支是否會讓它前進。本站會停止超時試跑,但仍應修正停止條件。
初始化的值已不符合條件
while 不是保證執行一次。先代入初始值算真假;空資料或目標 0 往往會直接跳過。
用浮點數恰好相等當停止條件
反覆加小數可能累積表示誤差。簡單計數優先用整數次數或清楚的上下界,不要等待某個小數剛好相等。
PAUSE AND TRY
先不要急著看別人的寫法
- 把存錢目標改成 0、30、31、90,分別需要幾輪?
- 指出 countdown 的更新若不小心寫成 += 1,為什麼無法停止。
- 比較 for 與 while:已知要走訪清單全部元素時,哪一種更直接?
先用紙筆預測,再改動範例中的數字或文字。結果與預期不同時,找出最早開始不同的那一步。
把這幾件事帶走
- 每個 while 都要有初始值、條件與更新。
- 先驗證 0 輪、1 輪與停止邊界。
- break 結束整層,continue 只跳過本輪剩下的工作。
FROM READING TO PRACTICE
用三道免費題,練習本章觀念
先做簡單題確認語法,再把幾個步驟組合起來。三題都來自本章主題的新版免費題庫,難度表示需要組合的基本概念。
延伸閱讀:Python 官方文件
以下是本章查證使用的官方資料。可以先完成入門練習,再回來查閱更完整的參數與說明。