本文 AI 產出,尚未審核

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 捕捉使用者中斷。

最佳實踐小結

  1. 保持迴圈內部的可讀性:將 break、continue 放在條件判斷的最上方,讓讀者一眼就能看出何時會提前結束或跳過。
  2. 適度使用 else:只有在需要特別表達「未觸發 break」的情境才使用 else,避免濫用造成混淆。
  3. 以 pass 標示未完成:配合 # TODO、# FIXME 等註解,讓團隊成員容易追蹤待完成的程式碼。
  4. 測試所有分支:寫單元測試時,確保 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 的旅程中,玩得開心、寫得順手!