本文 AI 產出,尚未審核

Python 課程 – 控制流程

主題:while 迴圈


簡介

在程式設計中,迴圈是讓程式重複執行相同程式碼區塊的核心機制。相較於 for 迴圈,while 迴圈的執行次數不一定與序列長度掛鉤,而是由條件式決定是否繼續。這樣的彈性使得 while 成為處理「直到某個條件滿足」或「不確定執行次數」的情境時的首選工具。

對於初學者而言,掌握 while 迴圈的寫法與注意事項,能夠大幅提升解題的思考能力;對於中級開發者,則能在撰寫 長時間運行的服務資料流處理演算法 時,寫出更具可讀性與效能的程式碼。


核心概念

1. 基本語法

while 條件式:
    # 迴圈內的程式碼
    # 必須要有會改變條件式的語句,否則會變成無限迴圈
  • 條件式:每次迴圈開始前都會被求值,結果為 True 時執行迴圈體,為 False 時跳出迴圈。
  • 迴圈體:必須至少包含一條能改變條件式的語句(如變數遞增、列表彈出),否則會產生無限迴圈

⚠️ 小提醒:Python 使用縮排來界定程式區塊,請務必保持一致的空格或 Tab。


2. 迴圈控制關鍵字

關鍵字 功能說明
break 立即結束當前迴圈,跳到迴圈外的第一行程式碼。
continue 跳過本次迴圈剩餘的程式碼,直接進入下一次條件判斷。
else while 正常結束(條件式為 False)時會執行 else 區塊;若因 break 結束則不會執行。

3. 常見的 while 用法

3.1 基本計數迴圈

# 例子 1:從 1 加到 5
i = 1
while i <= 5:
    print(f"第 {i} 次迴圈")
    i += 1          # 改變條件式,使迴圈最終會結束

重點:變數 i 必須在每次迴圈內遞增,否則 i <= 5 永遠為 True

3.2 使用 break 提前結束

# 例子 2:搜尋第一個大於 100 的正整數平方根
n = 1
while True:                 # 無限迴圈模板
    if n * n > 100:
        print(f"{n} 的平方大於 100")
        break               # 條件滿足即跳出
    n += 1

技巧while True: 搭配 break 可寫出清晰的搜尋/驗證流程。

3.3 以 continue 跳過不需要的情況

# 例子 3:印出 1~20 之間的奇數
num = 0
while num < 20:
    num += 1
    if num % 2 == 0:        # 偶數直接跳過
        continue
    print(num)

說明continue 讓程式直接回到條件判斷,避免不必要的巢狀 if

3.4 while ... else 的實用範例

# 例子 4:檢查列表中是否存在目標值
target = 7
numbers = [3, 5, 8, 2, 9]
index = 0
while index < len(numbers):
    if numbers[index] == target:
        print(f"找到目標 {target},位置在 index {index}")
        break
    index += 1
else:                       # 只有在 while 正常跑完才會執行
    print(f"列表中沒有目標 {target}")

觀念else 區塊相當於「搜尋失敗」的回報機制,常用於搜尋演算法

3.5 結合 try/except 防止意外中斷

# 例子 5:持續讀取使用者輸入,直到輸入合法的整數
while True:
    try:
        user_input = input("請輸入一個正整數 (或輸入 q 結束): ")
        if user_input.lower() == 'q':
            print("結束程式")
            break
        value = int(user_input)
        if value < 0:
            raise ValueError("必須是正整數")
        print(f"你輸入的數字是 {value}")
    except ValueError as e:
        print(f"輸入錯誤:{e},請再試一次。")

實務:在與使用者或外部系統互動時,while 搭配例外處理可保證程式的韌性


常見陷阱與最佳實踐

陷阱 說明 改善方式
無限迴圈 條件式永遠為 True(或忘記在迴圈內修改變數) 確認迴圈體內一定會改變條件;在開發階段加入計數器或 break 防護。
過度使用 while True 雖方便,但若缺乏明確的退出條件,程式可讀性下降 while True 加上註解說明何時會 break,或改寫為有明確條件的 while
在迴圈內過度運算 每次迴圈都做重複計算,影響效能 把不變的計算搬到迴圈外;使用快取(cache)或預先計算。
忘記 else 的行為 以為 else 會在 break 時執行,實際不會 只在需要「搜尋失敗」時使用 else,並在註解中說明其行為。
變數作用域混淆 在迴圈外使用未初始化的變數 在迴圈前先給變數初值,或使用 for 產生器代替。

最佳實踐

  1. 明確的退出條件

    • 在寫 while 前先寫下「什麼時候結束」的條件,並在程式碼中以註解標示。
  2. 使用 break/continue 時加上說明

    • 例:break # 找到目標,結束搜尋
  3. 避免深度巢狀

    • 若需要多層條件,可考慮抽成函式或使用 elif,保持單層迴圈結構。
  4. 加入安全計數(防止意外無限迴圈)

    max_iter = 10_000
    count = 0
    while condition and count < max_iter:
        # 迴圈內容
        count += 1
    if count == max_iter:
        print("警告:迴圈已達上限,可能出現邏輯錯誤")
    
  5. 善用 else

    • 只在「正常結束」與「提前中斷」需要不同處理時使用,避免濫用。

實際應用場景

場景 為何適合用 while 範例簡述
資料流讀取(如檔案、網路 socket) 讀取長度未知的資料,直到收到 EOF 或特定分隔符 while line := file.readline(): 逐行處理
使用者互動式 CLI 需要持續等待使用者輸入,直到使用者選擇退出 前面的「持續讀取使用者輸入」範例
遊戲主迴圈 每幀更新遊戲狀態,直到玩家關閉視窗 while not game_over: 內部處理渲染、事件
搜尋/驗證演算法(如二分搜尋、暴力破解) 迭代直到找到目標或搜尋範圍耗盡 while low <= high: 搭配 break
排程或輪詢(如監控服務) 定時檢查資源狀態,直到外部條件改變 while not stop_event.is_set(): time.sleep(5)

總結

  • while 迴圈是 Python 控制流程 中最具彈性的迴圈形式,適合「未知次數」或「條件驅動」的重複工作。
  • 掌握 breakcontinueelse 三大關鍵字,能讓迴圈的可讀性可控性大幅提升。
  • 常見的陷阱多半與條件永遠不變缺乏退出機制有關,寫程式時務必檢查變數是否在迴圈內被正確更新,或加入安全計數作為保護。
  • 在實務開發中,while 常被用於 資料流處理、使用者互動、遊戲主迴圈、搜尋演算法、排程輪詢 等情境;只要把握「何時結束」的概念,就能寫出既簡潔又可靠的程式碼。

最後提醒:在每一次使用 while 前,先寫下「什麼時候結束」的條件,並在程式碼中以註解標註。這個小習慣能幫你避免大多數的無限迴圈問題,讓你的 Python 程式更安全、更易維護。祝你在程式之路上 while 走得更遠!