CodeSprout程式萌芽

CHAPTER 05 · PYTHON FOUNDATIONS

While Loop (迴圈)

當次數取決於狀態時,用條件控制重複,學會讓迴圈可靠地停止。

這一章學會
  • 找出初始狀態、繼續條件與每輪更新
  • 分辨先檢查條件與至少執行一次
  • 用紙上追蹤避免無限迴圈
先預測結果,再看輸出。

這裡的範例是可在 Python 3 執行的獨立小程式;輸出框是預先核對的結果。題庫作答時,請保留題目提供的 solve 與參數,使用 return 交回答案。模組章的雙檔範例會另外標明操作方式。

01|先檢查,再執行

while 條件成立時就執行區塊,執行完重新檢查條件。如果一開始就是假,區塊一次也不會執行。寫 while 前先回答:現在狀態是什麼、什麼時候繼續、每輪會改變什麼?

PYTHON程式碼
remaining = 3
while remaining > 0:
    print(remaining)
    remaining -= 1
print("完成")
預期輸出
3
2
1
完成

02|追蹤狀態,看見停止的原因

下面每輪增加已存金額與天數;餘額達到目標後停止。第一輪前是 0 元、0 天,第一輪後是 30 元、1 天。把每一輪的值寫成小表格,就能看出第幾輪會越過門檻。

PYTHON程式碼
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],避免走到清單外面。

PYTHON程式碼
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 的整數商,可以去掉最右邊一位。確認狀態每輪都向停止條件靠近,比單純期待迴圈會停更可靠。

PYTHON程式碼
number = 472
digits = []
while number > 0:
    digits.append(number % 10)
    number //= 10
print(digits)
預期輸出
[2, 7, 4]

05|break 的停止條件要能說清楚

while True 表示條件本身永遠成立,因此一定要有可達到的 break。入門時能用明確條件就先用明確條件;需要在區塊中途停止時,再使用 break。

PYTHON程式碼
attempt = 0
while True:
    attempt += 1
    if attempt == 3:
        break
    print(f"第 {attempt} 次嘗試")
print("停止在", attempt)
預期輸出
第 1 次嘗試
第 2 次嘗試
停止在 3

06|continue 前別漏掉更新

continue 會跳過本輪剩下的程式。若計數更新放在 continue 後面,某些情況可能一直停在同一個數字。下例先更新 number,再檢查是否略過,確保每輪都前進。

PYTHON程式碼
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

先不要急著看別人的寫法

  1. 把存錢目標改成 0、30、31、90,分別需要幾輪?
  2. 指出 countdown 的更新若不小心寫成 += 1,為什麼無法停止。
  3. 比較 for 與 while:已知要走訪清單全部元素時,哪一種更直接?

先用紙筆預測,再改動範例中的數字或文字。結果與預期不同時,找出最早開始不同的那一步。

把這幾件事帶走

  • 每個 while 都要有初始值、條件與更新。
  • 先驗證 0 輪、1 輪與停止邊界。
  • break 結束整層,continue 只跳過本輪剩下的工作。

FROM READING TO PRACTICE

用三道免費題,練習本章觀念

先做簡單題確認語法,再把幾個步驟組合起來。三題都來自本章主題的新版免費題庫,難度表示需要組合的基本概念。

延伸閱讀:Python 官方文件

以下是本章查證使用的官方資料。可以先完成入門練習,再回來查閱更完整的參數與說明。