iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0

前言

昨天我們認識了 for 迴圈的基本操作,像是用range()跑數字,或者用來遍歷清單。
但實際寫程式時,光有基礎還不夠。

今天,我們要更進一步認識迴圈控制(break、continue、pass),
巢狀迴圈、讓你的 for 迴圈寫起來更靈活、更聰明!

一、迴圈控制(break、continue、pass)

迴圈為什麼需要控制?

因為真實世界的需求常常不是「從頭跑到尾」就好,

有時候我們需要 中途跳出,或者 跳過不想處理的項目

甚至只是佔個位子,程式還沒寫好先「空轉」。

(1)break:我不玩了,直接跳出迴圈

白話:只要遇到條件成立,就馬上停止這個迴圈,不管還有多少沒跑完。

for num in range(1, 11):
    if num == 5:
        print("遇到 5,直接離開迴圈!")
        break
    print(num)
1
2
3
4
遇到 5,直接離開迴圈!

(2)continue:跳過這一次,繼續下一輪

白話:這一圈我不想做了,直接跳到下一次迴圈

for num in range(1, 6):
    if num == 3:
        print("跳過 3!")
        continue
    print(num)

輸出:

1
2
跳過 3!
4
5

(3)pass:啥也不做,先放著

白話:當程式還沒想好要寫什麼,但語法上需要一個「東西」,就用 pass 佔位。

for num in range(1, 4):
    if num == 2:
        pass  # 先不做事,避免程式報錯
    print("現在處理數字:", num)

輸出:

現在處理數字: 1
現在處理數字: 2
現在處理數字: 3

⚠️ 新手踩雷區

  1. 誤會 break
    很多新手以為 break 可以直接把整個程式停掉,但其實它只會「跳出當前的圈」。
for num in range(5):
    if num == 2:
        print("遇到 2,break!")
        break
    print("現在的數字:", num)

print("迴圈結束,程式還在繼續跑喔~")

輸出:

現在的數字: 0
現在的數字: 1
遇到 2,break!
迴圈結束,程式還在繼續跑喔~

可以看到break,只是跳出這個for迴圈,程式後面還是繼續執行迴圈。
如果你以為break會把整個程式關掉,就會大錯特錯!

2. 亂用 continue

有時候新手會在「錯的地方」放 continue,導致某些程式碼永遠沒機會執行。來看下面這題!

假設要列出 0~4,每次都要印出數字,然後說它是偶數還是奇數。

#錯誤示範
for num in range(5):
    if num % 2 == 0:
        continue   # 小明以為這樣是"偶數時直接跳過 if 判斷"
    print(num, "是偶數")

輸出:

1 是偶數
3 是偶數

結果 continue 把「偶數情況下的 print()」整個跳過了,導致偶數完全沒被印出,程式邏輯跑偏。

以下是有關break/continue的一些例子!可以跟著slide的練習一起做做看,
一起思考!

範例:找到感冒藥就離開藥櫃(break)

medicine = ["退燒藥", "止痛藥", "感冒藥", "維他命"]

for item in medicine:
    print("找到:", item)
    if item == "感冒藥":
        print("✔️ 找到了感冒藥,結束搜尋。")
        break

https://ithelp.ithome.com.tw/upload/images/20250926/2016472136PWfa65pf.png

首先,我們利用一個list去存四種藥品,再利用for-loop去判斷「感冒藥」
是否在list中,找到的話就結束搜尋。

這邊可以看到我把break放在這個位置是想讓程式找到感冒藥就立馬離開迴圈,
那你可以想想看,如果沒有break會發生什麼事情?














好!來看答案!跟你心中是不是想的一樣呢?
https://ithelp.ithome.com.tw/upload/images/20250926/20164721HxFuUQgZAu.png

如果沒有break的話,程式就又會再度進入for迴圈把剩下的藥品尋找完~

範例:跳過過期藥品(continue)

medicine = ["維他命", "過期藥品", "止咳藥", "退熱貼"]

for item in medicine:
    if item == "過期藥品":
        print("⚠️ 發現過期藥,跳過!")
        continue
    print("✔️ 檢查藥品:", item)

https://ithelp.ithome.com.tw/upload/images/20250926/20164721WUCOxbY0hg.png

這題我們是在檢查藥品!需要把過期藥品找出來,並且跳過它!

這邊一樣用了list去存藥品們,再利用for迴圈把過期藥品找出來!

如果發現過期藥品就print(”發現過期藥,跳過!”)
然後「繼續」檢查List剩下的藥品~

這邊一樣請讀者想想,如果把continue省略呢?結果會改變嗎?

/images/emoticon/emoticon19.gif

好這次不賣關子!

答案如下:
有發現嗎,在過期藥品那邊,會兩邊都print!
https://ithelp.ithome.com.tw/upload/images/20250926/201647219PRGeAGT3g.png

medicine = ["維他命", "過期藥品", "止咳藥", "退熱貼"]

for item in medicine:
    if item == "過期藥品":
        print("⚠️ 發現過期藥,跳過!")
       
    print("✔️ 檢查藥品:", item)

二、巢狀迴圈(Nested Loop)

巢狀迴圈的意思就是迴圈裡面再包迴圈,就像迴圈的套娃。(一層層的感覺)
常用在「組合、排列」或是「處理二維資料」。

經典範例(應該沒人在學巢狀迴圈時不是寫九九乘法吧)

for a in range(1, 10):               # 讓 a 從 1 執行到 9
    for b in range(1, 10):             # 讓 b 從 1 執行到 9
        print(f'{a}x{b}={a*b}',end=' ')# 使用格式化字串,印出產生對應的字串,最後加上 end=' '表示不換行
    print('')# 內層迴圈執行結束後,執行 print('') 會換行顯示

輸出:
https://ithelp.ithome.com.tw/upload/images/20250926/20164721sjza6oSCsj.png

接下來,我們來看一下實戰範例!

實戰範例1:班級學生成績統計

情境說明:

老師想要幫班上每個學生計算三科總分與平均分數,並判斷是否及格(平均 ≥ 60 分)。

我們會用:

  • 外層迴圈:跑每一位學生
  • 內層迴圈:跑每位學生的每一科成績
  • list 存資料、input() 收成績、if/else 判斷及格與否
# 範例:班級成績判斷系統

students = []      # 存放學生姓名
all_scores = []    # 存放每位學生的各科成績
all_status = []    # 存放每位學生的及格/不及格狀態

num_students = int(input("請輸入班上學生人數: "))
num_subjects = int(input("請輸入每位學生科目數: "))

for i in range(num_students):
    name = input(f"請輸入第 {i+1} 位學生姓名: ")
    students.append(name)
    
    scores = []
    for j in range(num_subjects):
        score = int(input(f"輸入 {name} 第 {j+1} 科成績: "))
        scores.append(score)
    all_scores.append(scores)
    
    # 計算平均
    average = sum(scores) / num_subjects
    
    # 判斷及格與否
    if average >= 60:
        status = "及格"
    else:
        status = "不及格"
    
    all_status.append(status)

# 顯示結果
print("\n=== 成績總表 ===")
for i in range(num_students):
    print(f"{students[i]} 的成績: {all_scores[i]}, 平均: {sum(all_scores[i])/num_subjects:.2f}, 狀態: {all_status[i]}")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250926/20164721jTI2ItQ7PR.png

哇!是不是有點暈頭轉向呢!

讓我來好好解釋這段程式碼吧~

  1. 巢狀迴圈 (nested loop)

    • 外層迴圈:依序處理每位學生。
    • 內層迴圈:依序輸入每位學生的各科成績。
  2. 利用if/else判斷status

    • 判斷平均分數是否 >= 60,決定 status
    • 比單行條件運算更清楚,容易擴充更多判斷。
  3. list 的運用

    • students 存名字。
    • all_scores 存每位學生的各科成績。
    • all_status 存每位學生的及格/不及格狀態。
  4. 利用 sum(scores)/num_subjects 計算平均。

實戰範例2: ATM提款機

print("=============================")
print("公告:2025 IThome鐵人競賽第12天")
print("=============================")

balance = 10000  # 初始餘額
options = ["查詢餘額", "領錢", "存錢", "結束交易"]

print("=== 歡迎使用ATM ===")

# 外層 for 控制「交易次數」(假設最多可以做 5 次交易)
for t in range(5):
    print("\n請選擇服務:")
    for i, opt in enumerate(options, 1):
        print(f"{i}. {opt}")

    choice = int(input("請輸入選項 (1-4): "))

    if choice == 1:  # 查詢餘額
        print(f"💰 目前餘額:{balance} 元")

    elif choice == 2:  # 領錢
        withdraw = int(input("請輸入提款金額:"))
        if withdraw > balance:
            print("⚠️ 餘額不足,交易取消")
            continue  # 直接跳過這次,回到選單
        balance -= withdraw
        print(f"✅ 成功領取 {withdraw} 元,目前餘額:{balance} 元")

    elif choice == 3:  # 存錢
        deposit = int(input("請輸入存款金額:"))
        balance += deposit
        print(f"✅ 成功存入 {deposit} 元,目前餘額:{balance} 元")

    elif choice == 4:  # 結束交易
        print("👋 感謝使用,本次交易結束!")
        break  # 跳出外層迴圈,結束程式

    else:
        print("⚠️ 無效的選項,請重新輸入")

程式邏輯解析

這邊讀者不用擔心,我會分成不同區塊做詳細的解釋!

這樣就可以更仔細的了解每個部分的程式邏輯~一起來看看吧!

(1)初始化:

  • 使用者的初始餘額設定為 10000 元
  • list 存放四個選項,方便後面自動列印。
balance = 10000  
options = ["查詢餘額", "領錢", "存錢", "結束交易"]

(2)外層 for 迴圈:

  • ATM 設定最多 可以操作 5 次交易(避免使用者無限輸入)。
  • t 只是次數的計數器,不特別使用。
for t in range(5):

(3)內層 for 迴圈:顯示選單

  • enumerate(options, 1) 會同時回傳 索引值(從 1 開始)+ 選項內容。(這邊先埋個enumerate伏筆)
    • 例:1. 查詢餘額2. 領錢 ...
  • 讓選單自動化,不需要手動寫死每一行。

(4)輸入選項+判斷

choice = int(input("請輸入選項 (1-4): "))

使用者輸入數字 → 用 if/elif/else 進行判斷
https://ithelp.ithome.com.tw/upload/images/20250926/20164721sSwJ2yXKbh.png

(5)選項 1:查詢餘額

if choice == 1:
    print(f"💰 目前餘額:{balance} 元")

直接顯示目前餘額
https://ithelp.ithome.com.tw/upload/images/20250926/20164721ehsLaIATpF.png

(6)選項2:提款

elif choice == 2:
    withdraw = int(input("請輸入提款金額:"))
    if withdraw > balance:
        print("⚠️ 餘額不足,交易取消")
        continue  # 跳過這次,回到選單
    balance -= withdraw
    print(f"✅ 成功領取 {withdraw} 元,目前餘額:{balance} 元")

https://ithelp.ithome.com.tw/upload/images/20250926/20164721D6J1zjfScQ.png

這邊假設我輸入要提款6000,就可以看到它顯示餘額剩下4000元!

這邊要來好好解釋一下!

  • 先讓使用者輸入提款金額並存進 withdraw
  • 判斷是否超過餘額
    • 如果超過 → 印出「餘額不足」,直接 continue 回到選單(這次交易結束)。
    • 如果金額合理 → 更新餘額 balance -= withdraw,並印出新餘額。

(7)選項3:存錢

elif choice == 3:
    deposit = int(input("請輸入存款金額:"))
    balance += deposit
    print(f"✅ 成功存入 {deposit} 元,目前餘額:{balance} 元")
  1. 輸入存款金額 deposit
  2. 把金額加到餘額 balance += deposit
  3. 印出新餘額。

https://ithelp.ithome.com.tw/upload/images/20250926/2016472164tqmbvD5p.png
這邊可以看到如果我們要存5000元,他的結果會是剛剛的餘額4000再加上現在存入的5000會變上9000元。

(8)選項4:結束交易

elif choice == 4:
    print("👋 感謝使用,本次交易結束!")
    break

使用者選擇「結束」時,印出提示並 break 跳出外層迴圈,結束整個程式。

https://ithelp.ithome.com.tw/upload/images/20250926/20164721Kh4epnfFID.png

(9)選項錯誤處理

else:
    print("⚠️ 無效的選項,請重新輸入")

使用者如果輸入不是 1–4,就會提示錯誤,重新回到迴圈。

💡break & continue 在範例中的角色

  • continue
    • 出現在提款功能。
    • 當提款金額大於餘額 → ATM 不允許操作,直接跳過本次交易,回到選單。
  • break
    • 出現在「結束交易」。
    • ATM 立刻結束程式,不再讓使用者繼續操作。

今日結語

哇哇哇!今天也是一場硬戰!!辛苦啦~

昨天本來規劃今天會一起介紹zip(),enumerate()~

結果!!!
在break,continue,pass,巢狀迴圈的部分直接一發不可收拾,越打越多!!
所以只好把zip(),enumerate()放到明天了~請各位讀者見諒!!

今天我們從 break、continue、pass 玩到 巢狀迴圈
還寫了班級成績統計、ATM提款機這些小範例。

其實這些看起來小小的技巧,卻能讓程式變得更聰明、更貼近真實需求。

  • break:遇到條件就「我先走啦!」
  • continue:這一圈不玩了,直接跳下一圈
  • pass:暫時空著,先佔位

搭配巢狀迴圈,你就能處理更複雜的邏輯,不用再傻傻從頭跑到尾。

今天學完,你已經能開始掌握迴圈流程了!直接level up!

明日預告

明天我們要挑戰一些更進階的小技巧,讓你的 for 迴圈更強大:

  1. zip() & enumerate()
    • zip(): 可以把兩個清單「綁在一起」,像商品名稱配價格,一次搞定。
    • enumerate(): 想要同時拿到索引跟元素?不用自己算,enumerate 幫你搞定!
  2. for-else
    • 是的,for 也可以搭 else!
    • 超級適合「找東西找不到就做別的事」的場景。
    • 明天會用簡單範例示範,保證一看就懂、馬上能用。

明天學完這些,你的迴圈功力就又升級啦!

那麼我們就明天見啦!!


上一篇
【Day11】 迴圈登場!從 range() 到 for-loop的第一步
下一篇
【Day13】for 迴圈的隱藏技能包: zip、enumerate、for-else
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言