本文 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 產生器代替。 |
最佳實踐
明確的退出條件
- 在寫
while前先寫下「什麼時候結束」的條件,並在程式碼中以註解標示。
- 在寫
使用
break/continue時加上說明- 例:
break # 找到目標,結束搜尋。
- 例:
避免深度巢狀
- 若需要多層條件,可考慮抽成函式或使用
elif,保持單層迴圈結構。
- 若需要多層條件,可考慮抽成函式或使用
加入安全計數(防止意外無限迴圈)
max_iter = 10_000 count = 0 while condition and count < max_iter: # 迴圈內容 count += 1 if count == max_iter: print("警告:迴圈已達上限,可能出現邏輯錯誤")善用
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 控制流程 中最具彈性的迴圈形式,適合「未知次數」或「條件驅動」的重複工作。- 掌握
break、continue、else三大關鍵字,能讓迴圈的可讀性與可控性大幅提升。 - 常見的陷阱多半與條件永遠不變或缺乏退出機制有關,寫程式時務必檢查變數是否在迴圈內被正確更新,或加入安全計數作為保護。
- 在實務開發中,
while常被用於 資料流處理、使用者互動、遊戲主迴圈、搜尋演算法、排程輪詢 等情境;只要把握「何時結束」的概念,就能寫出既簡潔又可靠的程式碼。
最後提醒:在每一次使用
while前,先寫下「什麼時候結束」的條件,並在程式碼中以註解標註。這個小習慣能幫你避免大多數的無限迴圈問題,讓你的 Python 程式更安全、更易維護。祝你在程式之路上 while 走得更遠!