iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0

前言

昨天我們學了 for 迴圈 更進階的用法:

  • 迴圈控制:break、continue、pass
  • 巢狀迴圈
  • 實戰演練(學生成績統計、ATM)

有了這些工具,程式已經可以跑得更靈活。
但還有一些小技巧,可以讓 for 迴圈更「聰明」,
讓程式碼更精簡、邏輯更清楚。

今天,我們要介紹三個實用技巧:

  1. enumerate():自動幫元素加上編號
  2. zip():把多個 list 綁在一起,同時處理
  3. for-else:在「沒有遇到 break」時,額外執行的動作

ㄧ、zip() 與 enumerate()

為什麼需要 zip() 和 enumerate()?

昨天我們學到 for 迴圈,可以讓電腦一個一個抓出元素,
幫我們處理 list 或 string。

昨天在ATM的範例,也有先埋個伏筆。這邊來解釋原因:

有時候,我們會遇到以下兩個問題:

  1. 同時需要「索引值」跟「元素」
    • 例如:我有一個學生名單,想要同時印出「座號」跟「名字」。
    • 用一般 for 迴圈還要自己 range(len(list)),有點麻煩。
  2. 同時需要處理兩個(或以上)的清單
    • 例如:一個 list 是「商品名稱」,另一個 list 是「價格」,我要一邊列印名稱一邊列印價格。
    • zip() 就能把多個清單「綁在一起」。

(1)enumerate():幫元素自動加上編號

  • 有時候我們想同時拿到 索引值元素內容
  • enumerate() 就是專門為這種情況準備的,它會回傳 (索引, 元素)
  • 還可以指定起始值,不一定要從 0 開始。

語法:

for 索引, 元素 in enumerate(清單, 起始值):

範例:學生名單

students = ["Amy", "Ben", "Cathy"]

for i, name in enumerate(students, 1):
    print(f"座號 {i}: {name}")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250927/20164721eTSiRazcyU.png

小技巧:
第二個參數 1,可以讓編號從 1 開始,不然預設是從 0。

(2) zip():把兩個(或多個)清單綁在一起

  • 當你有兩個以上的 list,想要「配對」處理時,用 zip() 就很方便。
  • zip() 會把多個 list 壓縮成 tuple,讓你一邊跑一邊拿到對應元素。

語法:

for 元素1, 元素2 in zip(list1, list2):

範例:商品清單


items = ["Burger", "Fries", "Cola"]
prices = [80, 40, 30]

for item, price in zip(items, prices):
    print(f"{item} 售價 {price} 元")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250927/20164721fxqu8dhQWn.png

實戰演練:小型購物清單系統

結合 enumerate() + zip()

menu = ["Burger", "Fries", "Cola", "Icecream"]
prices = [80, 40, 30, 50]

print("=== 菜單 ===")
for i, (item, price) in enumerate(zip(menu, prices), 1):
    print(f"{i}. {item} - {price} 元")

choice = int(input("請輸入餐點編號: "))
print(f"你選擇了 {menu[choice-1]},價格 {prices[choice-1]} 元")

輸出:

https://ithelp.ithome.com.tw/upload/images/20250927/20164721aFjYmbb6tT.png

二、for-else:只有「沒被 break 掉」才會跑

很多人第一次看到 for-else 會覺得奇怪:
「不是 if 才有 else 嗎?為什麼 for 也有?」

其實規則很簡單:

當 for 迴圈完整跑完,沒有被 break 中斷,才會執行 else。

  • 適合用在:
    1. 搜尋清單中是否有某個元素
    2. 驗證清單中所有元素是否符合某條件
    3. 其他需要「跑完整個迴圈才知道結果」的情境
for 每個元素:
    如果發生某件事 → break
else:
    如果沒有 break → 執行這裡

範例 1:尋找清單中是否有 4

numbers = [3, 7, 2, 9, 5]

for num in numbers:
    if num == 4:
        print("找到 4!")
        break
else:
    print("清單中沒有 4")

輸出:

清單中沒有 4

說明:

  • 清單沒有 4 → for 跑完全部元素 → 執行 else
  • 如果清單有 4 → 遇到 break → else 不會執行

範例 2:檢查班級成績

scores = [78, 90, 56, 88]

for s in scores:
    if s < 60:
        print("有人不及格!")
        break
else:
    print("全員及格!")

輸出:

有人不及格!

說明:

  • 有一個成績低於 60 → break → else 不跑
  • 如果所有成績都 >= 60 → else 會跑 → 印「全員及格!」

範例3:驗證清單中數字是否全為正數

nums = [5, 10, 3, -1, 7]

for n in nums:
    if n <= 0:
        print("發現非正數:", n)
        break
else:
    print("全部都是正數!")

輸出:

發現非正數: -1

實戰演練 1:尋找缺貨商品

假設我們有一個購物清單,想確認每個商品是否都有庫存:

products = ["Burger", "Fries", "Cola", "Icecream"]
stocks = [5, 3, 0, 4]   # 庫存

for item, stock in zip(products, stocks):
    if stock == 0:
        print(f"⚠️ {item} 缺貨!")
        break
else:
    print("✅ 所有商品都有庫存!")

輸出:

⚠️ Cola 缺貨!

說明:

  • Cola 庫存為 0 → break → else 不跑
  • 如果沒有缺貨 → else 跑 → 印「所有商品都有庫存!」

實戰演練 2:密碼驗證系統

想要檢查密碼是否符合規則(至少有一個大寫、一個數字):

passwords = ["apple123", "Banana", "Orange1"]

for pw in passwords:
    if not any(c.isupper() for c in pw):
        print(f"{pw} 缺少大寫字母!")
        break
    if not any(c.isdigit() for c in pw):
        print(f"{pw} 缺少數字!")
        break
else:
    print("✅ 所有密碼都符合規則!")

輸出:

apple123 缺少大寫字母!

說明:

  • 第一個密碼 apple123 沒有大寫 → break → else 不跑
  • 如果所有密碼都符合條件 → else 跑 → 印「所有密碼都符合規則!」

結合 enumerate() + zip() + for-else

範例:班級考試分數檢查

假設我們有三個科目的分數清單,要檢查每位學生是否都有及格,並統計總分:

students = ["Amy", "Ben", "Cathy", "David"]
math_scores = [78, 90, 55, 88]
eng_scores = [82, 85, 60, 92]
science_scores = [80, 75, 58, 89]

for i, (name, math, eng, sci) in enumerate(zip(students, math_scores, eng_scores, science_scores), 1):
    print(f"{i}. {name} - 數學: {math}, 英文: {eng}, 自然: {sci}")
    
    if math < 60 or eng < 60 or sci < 60:
        print(f"⚠️ {name} 有科目不及格!")
        break
else:
    total_scores = [m+e+s for m, e, s in zip(math_scores, eng_scores, science_scores)]
    print("✅ 全員及格!")
    for name, total in zip(students, total_scores):
        print(f"{name} 總分: {total}")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250927/20164721cDOTZqCmT4.png

說明:

  • zip() → 同時取出學生名與三科分數
  • enumerate() → 自動編號
  • for-else → 只要有人不及格就 break → else 不跑;如果全部及格 → else 跑,計算總分

新手常見錯誤

1.忘記 enumerate 的起始值

items = ["a", "b", "c"]
for i, v in enumerate(items):
    print(i, v)

別忘記喔!預設是從 0 開始,新手常常以為是從 1 開始。
解法:使用enumerate(items, 1)

2.zip 長度不同

names = ["Amy", "Ben"]
scores = [90, 80, 70]

for name, score in zip(names, scores):
    print(name, score)

這樣會輸出到最短的 list 為止,多的資料會被忽略。

輸出:(70不見了,被省略!)
https://ithelp.ithome.com.tw/upload/images/20250927/20164721P5zUe0gpAy.png

3.for-else 誤解

很多人以為 for-else 的 else 是「迴圈條件不成立就執行」,像 while-else 一樣。

for i in range(3):
    if i == 1:
        break
else:
    print("沒被 break 掉才會出現")

其實它的規則是:如果迴圈沒有被 break 中斷,才會執行 else。

今日小結

今天我們把 Day12 的教學內容(break、continue、巢狀迴圈)再升級,

帶大家認識了幾個讓 for 迴圈變得更聰明的小工具:

  • enumerate() → 幫你自動加上編號,不用再自己寫 i = i + 1
  • zip() → 可以一次遍歷好幾個清單,像是「多人一起走紅毯」的感覺。
  • for-else → 如果整個迴圈跑得很順、沒有被 break 中斷,才會執行 else

有了這些招式,你的程式碼會更乾淨、更容易讀,
也能少掉不少「土法煉鋼」的 if 判斷。

今天是不是覺得 for 迴圈不再是單純的「重複工人」,
而是個 會動腦的助手?(應該有感受到for的實用吧!)

明日預告

既然我們把 for 玩得這麼溜,明天換它的兄弟出場啦 —— while 迴圈

  • for 就像「排隊買票」,隊伍多長、就跑幾次。
  • while 比較像「玩遊戲」,只要血條還沒歸零,就會一直打下去。

它特別適合用在「我也不知道要跑幾次」的狀況,比如:

1.玩家血量沒清零 → 遊戲繼續
2.使用者輸入錯誤 → 一直重問直到答對

明天有時間的話(或是空間還夠的話),
我們還會聊到 while-else 的神秘用法!
以及大家最怕的「無窮迴圈」陷阱!!(超重要)

保證明天的例子會很實戰,練功路上,有我陪你!一起加油~
那麼我們就明天見囉!


上一篇
【Day12】for 迴圈進階玩法:巢狀迴圈與迴圈控制
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言