昨天我們學了 for 迴圈 更進階的用法:
有了這些工具,程式已經可以跑得更靈活。
但還有一些小技巧,可以讓 for
迴圈更「聰明」,
讓程式碼更精簡、邏輯更清楚。
今天,我們要介紹三個實用技巧:
昨天我們學到 for 迴圈,可以讓電腦一個一個抓出元素,
幫我們處理 list 或 string。
昨天在ATM的範例,也有先埋個伏筆。這邊來解釋原因:
有時候,我們會遇到以下兩個問題:
range(len(list))
,有點麻煩。zip()
就能把多個清單「綁在一起」。enumerate()
就是專門為這種情況準備的,它會回傳 (索引, 元素)
。語法:
for 索引, 元素 in enumerate(清單, 起始值):
範例:學生名單
students = ["Amy", "Ben", "Cathy"]
for i, name in enumerate(students, 1):
print(f"座號 {i}: {name}")
輸出:
小技巧:
第二個參數 1
,可以讓編號從 1 開始,不然預設是從 0。
語法:
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} 元")
輸出:
結合 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]} 元")
輸出:
很多人第一次看到 for-else
會覺得奇怪:
「不是 if 才有 else 嗎?為什麼 for 也有?」
其實規則很簡單:
當 for 迴圈完整跑完,沒有被 break 中斷,才會執行 else。
for 每個元素:
如果發生某件事 → break
else:
如果沒有 break → 執行這裡
numbers = [3, 7, 2, 9, 5]
for num in numbers:
if num == 4:
print("找到 4!")
break
else:
print("清單中沒有 4")
輸出:
清單中沒有 4
說明:
scores = [78, 90, 56, 88]
for s in scores:
if s < 60:
print("有人不及格!")
break
else:
print("全員及格!")
輸出:
有人不及格!
說明:
nums = [5, 10, 3, -1, 7]
for n in nums:
if n <= 0:
print("發現非正數:", n)
break
else:
print("全部都是正數!")
輸出:
發現非正數: -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 缺貨!
說明:
想要檢查密碼是否符合規則(至少有一個大寫、一個數字):
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 缺少大寫字母!
說明:
假設我們有三個科目的分數清單,要檢查每位學生是否都有及格,並統計總分:
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}")
輸出:
說明:
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不見了,被省略!)
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 的神秘用法!
以及大家最怕的「無窮迴圈」陷阱!!(超重要)
保證明天的例子會很實戰,練功路上,有我陪你!一起加油~
那麼我們就明天見囉!