簡單來說:
range()
= 幫你生一堆數字(彈藥)。for
= 幫你一個一個拿出來(射擊)。昨天 Day10 我們學到 range()
,它就像是一台「裝填機」,可以自動幫你產生一整排的數字序列。
但是數字只是「在倉庫裡排好隊」,程式還需要一隻「手」把它們一個一個拿出來用。
這隻手就是 for 迴圈。
老實說,我第一次學程式的時候,對「重複」這件事感到非常煩躁。
印 1 到 10?我一開始的做法是:
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)
當時的我心裡想:「程式不是應該比人聰明嗎?為什麼我還要這麼笨地一直複製貼上?」
後來老師在黑板上寫下:
for i in range(1, 11):
print(i)
我整個人愣住,心想:「這三行程式就能取代我剛剛的十行?」
但下一秒又滿頭問號:「for
是什麼?i
又是誰?為什麼是 range(1, 11)
而不是 range(1, 10)
?」
這就是我第一次見到 for
迴圈的感覺:
又驚艷,又困惑。
直到後來我慢慢理解──for
不是什麼魔法,它只是幫我「一個一個拿出東西來用」。
那一刻我真的有種「啊哈!原來如此」的頓悟感。
從此以後,寫程式不再是無止盡的複製貼上,
而是交給電腦自動完成。(也不用一行一行複製打)
Python 提供了兩種主要的迴圈結構:
今天,我們會先從 for 迴圈 開始。
因為它跟昨天學到的 range()
簡直是天作之合,
兩者搭配起來,會讓很多「重複動作」變得超級簡單!
這邊先提前給一個小小懶人包!
for
的概念與語法。list
、str
、range()
等)如何被 for
遍歷。for
迴圈到底在做什麼?想像你有一疊便利貼,上面寫著任務──「寄信」、「洗碗」、「買菜」。你會一張一張拿起來做,做完就丟掉。
for迴圈
就是這個動作:把一個容器(可迭代物件)裡的東西 依序 拿出來,對每一項執行一段程式。
重點是:你不需要自己去數或去算位置,for
迴圈會自動把「下一個」給你。
而程式最常見的需求之一就是 重複做某件事。
你總不可能手動寫一百行 print()
,對吧?
舉例:昨天你用 range(5)
得到 [0, 1, 2, 3, 4]
。
如果想逐一印出裡面的元素,以前我們只能慢慢一個個取索引:
numbers = list(range(5))
print(numbers[0])
print(numbers[1])
print(numbers[2])
print(numbers[3])
print(numbers[4])
但如果用 for 迴圈,一行就搞定:
for i in range(5):
print(i)
💡我們先來看一下結構:
for 變數 in 可迭代物件:
縮排區塊(要重複執行的程式)
這一行其實可以拆成三個部分來理解:
for 變數
for x in range(5):
,那麼這個 x
就會依序拿到 0, 1, 2, 3, 4
。in 可迭代物件
range()
、list
、字串
、tuple
、甚至字典(dict)。range(5)
→ 會依序提供 0, 1, 2, 3, 4
["apple", "banana", "cherry"]
→ 會依序提供 "apple"
, "banana"
, "cherry"
"Hello"
→ 會依序提供 "H"
, "e"
, "l"
, "l"
, "o"
縮排區塊(要重複執行的程式)
for
迴圈抓到一個新值,就會執行這一塊縮排的程式碼。範例1:
for i in range(5):
print("第", i, "次")
輸出:
第 0 次
第 1 次
第 2 次
第 3 次
第 4 次
範例2:
fruits = ["apple", "banana", "cherry"]
for f in fruits:
print("我想吃:", f)
輸出:
我想吃: apple
我想吃: banana
我想吃: cherry
for
會把 fruits
裡的每一個元素依序放入變數 f
,然後執行縮排區塊。很多新手會以為i 只在迴圈裡才有效,結束後就會消失
但在 Python 裡,i會保留最後一次的值喔!
我們看一下這邊的範例,你就會更清楚!
for i in range(3):
print(i)
print("迴圈結束後 i =", i)
除了 range(),for 也能跑其他東西喔!
其實 for
能用的不只是 range()
,任何「可迭代物件 (iterable)」都能用。
for i in range(1,6): # 1 到 5
print(i)
為了更清楚的解釋!我在這邊做了一張slide供參考:
再來看看下面的例子!還記得昨天教的range()語法嗎?試著想想看!
輸出內容和你心裡想的一樣嗎?如果是的話!恭喜你呦!
這樣可以把2到10之間2的倍數都印出來~
我們來打鐵趁熱!繼續來試試看這題練習~(先別急著看答案)
請用for迴圈 列印出以下的內容:
這邊我來引導一下這題的邏輯~讀者可以參考一下:
(1).可以先看成這段程式會讓電腦「從 1 數到 10」,每數到一個數字就把它的平方算出來並印出一行文字:例如 1 的平方是 1、2 的平方是 4⋯⋯直到 10 的平方是 100。
(2).有發現什麼規律嗎?
(3).那該如何從「 1 開始,一直到 10,每次加 1 」 呢?
這邊你應該會聯想到:
range()
,可以自動幫我們生成一個數列。(4).利用for迴圈!
「既然 range(1, 11)
可以產生出 1 到 10,那我們就可以讓 for
把裡面的數字一個一個拿出來用。
答案:
for i in range(1, 11):
print(i, "的平方是", i**2)
for ch in "Python": #分別會把字母印出來
print(ch)
輸出:
P
y
t
h
o
n
nums = [2,4,6]
for n in nums:
print(n * 2)
輸出:
4
8
12
這邊之後會介紹到!
scores = {"Amy": 90, "Bob": 80, "Cindy": 95}
for name in scores:
print(name, "的分數是", scores[name])
輸出:
Amy 的分數是 90
Bob 的分數是 80
Cindy 的分數是 95
有時候我們想到「索引」來取元素,可以這樣寫:
country = ["Japan", "USA", "France"]
for i in range(len(country)):
print("索引", i, ":", country[i])
輸出:
索引 0 : Japan
索引 1 : USA
索引 2 : France
但很多時候,直接跑元素會更簡潔!
題目:判斷是否為歐洲國家 + len()
假設我們有兩個清單:
country = ['台灣', '日本', '英國', '馬來西亞']
europe = ['英國', '法國', '德國', '挪威']
我們想要做的事情是:
把 country 裡面的每一個國家,逐一檢查是不是在 europe 裡面,
如果有,就說「它是歐洲國家」,否則就說「它不是歐洲國家」。
我們要的輸出內容,假設是這樣:
台灣不是歐洲國家
日本不是歐洲國家
英國是歐洲國家
馬來西亞不是歐洲國家
判斷完成
這裡的重點就是:我們要一個一個檢查列表中的元素
for num in range(len(country)):
if country[num] in europe:
print(country[num] + '是歐洲國家')
else:
print(country[num] + '不是歐洲國家')
print('判斷完成')
逐行拆解:
len(country)
len()
是一個內建函數,用來計算「列表的長度」。len(country)
= 4,因為 country
裡有 4 個元素。所以 range(len(country))
等於 range(4)
,會產生 [0, 1, 2, 3]
。
for num in range(len(country)):
num
依序取值 0 → 1 → 2 → 3。num
就是「索引值 (index)」,能幫我們找到 country
裡的元素。if country[num] in europe:
country[num]
:依照索引,取出 country
裡的第 num
個國家。in
:用來判斷這個國家是不是存在於 europe
清單中。print(...)
print('判斷完成')
來看看完整的解答吧!
#判斷是否為歐洲國家
country = ['台灣', '日本', '英國', '馬來西亞']
europe = ['英國', '法國', '德國', '挪威']
for num in range(len(country)):
if country[num] in europe:
print(country[num] + '是歐洲國家')
else:
print(country[num] + '不是歐洲國家')
print('判斷完成')
len()
不只可以算列表的長度,還能算字串、tuple、dictionary 等等。
print(len("Python")) # 6
print(len([1, 2, 3, 4])) # 4
print(len({"a": 1, "b": 2})) # 2
所以你可以把 len() 想像成一個「長度偵測器」,能快速告訴你「裡面有幾個東西」。
如果你現在剛開始學 for
,很可能會遇到跟我當時一樣的疑惑。
以下整理一些初學者最容易踩的坑:
1.搞不清楚 range()
的範圍
range(1, 11)
會包含 11,其實只到 10。for i in range(1, 11): # i = 1,2,...,10
print(i)
2.忘記縮排
3.誤會 i
的用途
i
不是什麼神秘符號,它只是個變數名字。num
、x
或 apple
:for apple in range(5):
print(apple)
4.以為只能搭配數字
for
不只可以跑數字,還能跑字串(str)、list,甚至字典(dict)。for ch in "Python":
print(ch)
5.忘記自己要印什麼
print()
。for
只負責「走訪每個元素」,你還是要告訴電腦「要拿它來做什麼」。6.少打冒號 :
for i in range(5) # 缺冒號,會報錯
word = "python"
請用for迴圈以及if-else判斷每個字母是母音 (a, e, i, o, u) 還是子音,
輸出格式如下:
p 是子音
y 是子音
t 是子音
h 是子音
o 是元音
n 是子音
code:
word = "python"
vowels = ['a', 'e', 'i', 'o', 'u']
for ch in word:
if ch in vowels:
print(ch, "是母音")
else:
print(ch, "是子音")
輸出:
說明:
menu = ["burger", "fries", "cola", "icecream"]
price = [80, 40, 30, 50]
shopping_list = []#存放使用者輸入的欲購買餐點
shopping_price = []
n = int(input("請問要點幾樣餐點? "))
for i in range(n):
item = input("請輸入餐點名稱: ")
if item in menu:
idx = menu.index(item) # 找到該餐點在 menu 裡的位置
shopping_list.append(item)
shopping_price.append(price[idx])
print(item, "已加入購物清單!")
else:
print("抱歉,菜單沒有", item)
print("你的購物清單:", shopping_list)
print("總金額:", sum(shopping_price), "元")
輸出:
(1)若輸入的餐點都是在菜單上的話
(2)若輸入的餐點有不在菜單上的話:
說明:
users
),一個存密碼(pwds
)。users
與 pwds
。小提醒:等之後學到 dict,這些可以更簡單寫!
現在先用 list 體會「迴圈的檢查」。
users = ["alice", "bob"]
pwds = ["1234", "5678"]
action = input("請輸入動作 (login/register): ")
if action == "login":
u = input("請輸入帳號: ")
p = input("請輸入密碼: ")
found = False
for i in range(len(users)):
if users[i] == u:
found = True
if pwds[i] == p:
print("登入成功!歡迎", u)
else:
print("密碼錯誤!")
break # 找到帳號就結束檢查
if not found:
print("帳號不存在,請註冊!")
elif action == "register":
new_u = input("請輸入新帳號: ")
new_p = input("請輸入新密碼: ")
users.append(new_u)
pwds.append(new_p)
print("註冊成功!")
print("目前所有帳號:", users)
else:
print("無效的動作!")
(1)若選擇登入功能(login)且登入成功:
(2)若選擇登入功能(login)但登入失敗:
(3)若選擇註冊(register)功能:
辛苦啦!相信今天的內容對新手來說應該是滿燒腦的!不過別擔心~我當初也花了很長時間才克服 for 迴圈!
以前我對 for 迴圈總是又怕又排斥,但它真的是學程式時絕對不能跳過的重點。
因為只要進入更大的專案,for 迴圈幾乎都是固定班底,天天會出現!
第一次學可能會覺得抽象、甚至頭昏腦脹,但只要多看幾遍、多做幾次練習,慢慢就能上手。等到用習慣之後,你會發現 for 迴圈超好用,隨時都能幫我們節省程式碼的長度!
今天我們實作了很多例子:
從「數字平方」、「字母逐字列印」,到「判斷列表元素是不是歐洲國家」,最後還有「小小實戰演練」。這些都讓我們更貼近 for 迴圈的使用場景。
總結來說,掌握 for 迴圈的精髓其實就是三件事:
對新手來說,最常見的錯誤就是:忘記縮排、變數命名亂,或者把 for 用在不會自動產生序列的東西上。今天先把這些基本概念練熟,未來就能少走冤枉路!!
明天我們會挑戰更進階的技巧,讓 for 迴圈威力加倍!
如果你有問題,歡迎在下方留言;如果覺得這篇對你有幫助,也別忘了點個 Like~
你們的支持就是我持續創作的動力!
明天我們要進一步學習:
另外還會準備 完整的實戰範例與踩雷提醒,幫助大家掌握進階迴圈技巧!
一起加油,我們明天見!