Python 控制流程:break、continue、pass
簡介
在程式的執行過程中,我們常會遇到需要提前結束迴圈、跳過某些迭代,或是佔位而不執行任何動作的情況。Python 為了讓這類需求寫得既直觀又簡潔,提供了三個關鍵關鍵字:break、continue 與 pass。掌握它們的使用方式,不僅能讓程式碼更易讀,也能避免不必要的錯誤與效能損失。
break:立刻終止目前所在的 迴圈(for或while),跳出迴圈體。continue:結束本次迭代,直接進入 下一輪 迴圈條件判斷。pass:什麼都不做,只是語法上的佔位,常用在尚未實作的程式區塊或需要保持語法完整的情況。
本篇文章將從概念說明、實作範例、常見陷阱與最佳實踐,最後延伸到實務應用場景,帶你全面掌握這三個控制流程工具。
核心概念
1. break – 立即中止迴圈
break 會直接跳出最近一層的迴圈,之後程式會接續執行迴圈外的第一行語句。常見的使用情境包括:
- 在搜尋資料時,找到目標即停止搜尋。
- 當使用者輸入特定指令想要提前結束程式。
範例 1:搜尋質數列表中的第一個偶數(其實不存在)
numbers = [2, 3, 5, 7, 11, 13]
for n in numbers:
if n % 2 == 0 and n != 2: # 假設我們只想找「非 2」的偶數
print(f"找到偶數 {n}")
break # 找到後立即停止迴圈
else:
# for 迴圈的 else 只在沒有觸發 break 時執行
print("沒有符合條件的偶數")
重點:
else區塊會在迴圈自然結束(未觸發break)時執行,這是break常與之搭配的技巧。
範例 2:使用者輸入 quit 時結束無限迴圈
while True:
cmd = input("請輸入指令(輸入 quit 離開):")
if cmd.lower() == "quit":
print("程式即將結束…")
break # 離開 while 迴圈,程式往下走
else:
print(f"你輸入了:{cmd}")
範例 3:讀取檔案時遇到特定字串即停止
with open("log.txt", "r", encoding="utf-8") as f:
for line in f:
if "ERROR" in line:
print("發現錯誤訊息,停止讀取")
break
# 其他處理...
2. continue – 跳過本次迭代
continue 會結束本輪迴圈的剩餘程式碼,直接回到迴圈條件判斷(for 會取下一個元素,while 會重新評估條件)。適用情境包括:
- 過濾不需要處理的資料。
- 跳過已知錯誤或不符合條件的項目。
範例 4:印出 1~10 之間的奇數
for i in range(1, 11):
if i % 2 == 0: # 偶數直接跳過
continue
print(i) # 只會印出奇數
範例 5:清理資料時忽略空白列
raw_data = ["Alice,23", "", "Bob,30", " ", "Charlie,25"]
cleaned = []
for line in raw_data:
if not line.strip(): # 空白或只含空格的列直接跳過
continue
cleaned.append(line)
print(cleaned) # ['Alice,23', 'Bob,30', 'Charlie,25']
範例 6:在迴圈中避免除以零的錯誤
numbers = [5, 0, 8, 2, 0, 7]
for n in numbers:
if n == 0:
print("遇到 0,跳過除法運算")
continue # 直接進入下一個 n
print(f"100 / {n} = {100 / n}")
3. pass – 佔位不執行
pass 本身不做任何事,只是保持語法完整。常見於:
- 尚未實作的函式、類別或條件分支。
- 抽象基礎類別中需要留空的抽象方法。
- 測試時暫時關閉某段程式碼。
範例 7:未完成的函式骨架
def calculate_salary(employee):
# TODO: 之後補上薪資計算邏輯
pass
範例 8:條件分支佔位
user_role = "guest"
if user_role == "admin":
print("管理員介面")
elif user_role == "member":
print("會員介面")
else:
# 目前尚未決定訪客要顯示什麼
pass
範例 9:類別中保留抽象方法
class Shape:
def area(self):
pass # 子類別必須自行實作
class Circle(Shape):
def __init__(self, r):
self.r = r
def area(self):
return 3.1416 * self.r ** 2
常見陷阱與最佳實踐
| 陷阱 | 說明 | 建議做法 |
|---|---|---|
在多層迴圈中只使用 break |
break 只會跳出最近一層迴圈,外層仍會繼續執行。 |
若需要一次跳出多層迴圈,可使用 旗標變數、return(在函式內)或 例外 (raise) 方式。 |
忘記 continue 之後的程式碼仍會執行 |
continue 只會跳過本次迭代的剩餘程式碼,不會結束整個迴圈。 |
確認 continue 放在條件判斷的最前面,避免不必要的運算。 |
使用 pass 隱藏錯誤 |
pass 不會拋出錯誤,若不小心把本應有檢查的程式碼寫成 pass,會造成功能缺失。 |
在開發階段使用 TODO 或 FIXME 註解標示,並配合 IDE 的待辦事項檢視功能。 |
else 與 break 混用產生誤解 |
for/while … else: 只在**未觸發 break**時執行,初學者常以為 else 代表「迴圈結束」的通用情況。 |
在說明 else 用法時,加上明確註解或使用 if not found: break 等寫法,提升可讀性。 |
在 while True 中忘記 break |
會導致無限迴圈,程式卡死。 | 盡量在迴圈內加入明確的退出條件,或使用 try/except KeyboardInterrupt 捕捉使用者中斷。 |
最佳實踐小結
- 保持迴圈內部的可讀性:將
break、continue放在條件判斷的最上方,讓讀者一眼就能看出何時會提前結束或跳過。 - 適度使用
else:只有在需要特別表達「未觸發break」的情境才使用else,避免濫用造成混淆。 - 以
pass標示未完成:配合# TODO、# FIXME等註解,讓團隊成員容易追蹤待完成的程式碼。 - 測試所有分支:寫單元測試時,確保
break、continue、pass所在的分支都有被觸發過,避免隱藏的邏輯錯誤。
實際應用場景
1. 資料清理與過濾
在爬蟲或資料前處理階段,常需跳過不符合條件的紀錄,或在找到第一筆有效資料後立即停止後續搜尋。
def find_first_valid_row(csv_path):
with open(csv_path, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
if not row["email"]: # 沒有 email 的列直接跳過
continue
if row["status"] == "inactive": # 若已停用則不再處理
continue
# 找到第一筆符合條件的資料
return row
return None
2. 使用者互動式指令列工具
在 CLI 程式中,使用 break 讓使用者輸入 exit 時即結束迴圈,使用 continue 忽略空白指令,提升使用體驗。
while True:
cmd = input("> ").strip()
if not cmd: # 空指令直接回到提示
continue
if cmd == "exit":
print("再見!")
break
# 其他指令處理…
3. 演算法中的早期退出
在搜尋或最佳化演算法裡,若已達到目標值,使用 break 可避免不必要的計算,大幅提升效能。
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid # 找到即立即 break (return)
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
4. 測試框架的佔位
在 TDD(Test‑Driven Development)流程中,先寫測試函式,再用 pass 讓測試通過語法檢查,之後逐步實作。
def test_calculate_tax():
# 先寫測試,暫時不實作函式
pass
總結
break、continue、pass 是 Python 控制流程的三把利器,分別負責「提前結束」迴圈、「跳過本次」迭代,以及「語法佔位」的需求。透過正確的使用時機與結構化的寫法,我們可以:
- 提升程式可讀性:讓迴圈的退出與跳過邏輯一目了然。
- 減少不必要的計算:在搜尋、演算法或資料過濾時,利用
break及continue立即停止或略過無效工作。 - 保持開發彈性:使用
pass佔位,使程式碼在尚未完成的階段仍能正常執行,方便協同開發與測試。
在實務開發中,建議將 break、continue 的使用限制在單層迴圈內,若需要跨層退出,考慮使用 旗標變數 或 自訂例外;而 pass 應配合 # TODO、# FIXME 等註解,避免遺忘未完成的邏輯。透過這些最佳實踐,你的 Python 程式將更加乾淨、易維護,且在面對各種控制流程需求時,能夠快速、正確地做出回應。祝你在 Python 的旅程中,玩得開心、寫得順手!