iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0

前言:range 只是裝填機,for 才是手

簡單來說:

  • 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 的迴圈結構有哪些?

Python 提供了兩種主要的迴圈結構:

  1. for 迴圈
    • 適合「已知範圍」或「逐一走訪序列(list, string, range…)」的情境。
    • 例子:我要印出 1 到 10 的數字。
  2. while 迴圈
    • 適合「不知道要跑幾次,但要重複直到條件成立」的情境。
    • 例子:登入系統,一直要求輸入密碼直到正確為止。

今天,我們會先從 for 迴圈 開始。

因為它跟昨天學到的 range() 簡直是天作之合,
兩者搭配起來,會讓很多「重複動作」變得超級簡單!

二、前情提要──今天要做什麼?

這邊先提前給一個小小懶人包!

  • 我將用白話一點的方式說清楚 for 的概念與語法。
  • 演示常見 iterable(liststrrange() 等)如何被 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 loop 基礎語法

💡我們先來看一下結構:

for 變數 in 可迭代物件:
    縮排區塊(要重複執行的程式)

這一行其實可以拆成三個部分來理解:

  • for 變數
    • 這個「變數」就像是一個暫存器,用來裝迴圈跑到的當前值。
    • 例如:如果你用 for x in range(5):,那麼這個 x 就會依序拿到 0, 1, 2, 3, 4
    • 你可以把它想像成「一個盒子」,每次迴圈運轉時,會自動把下一個值放進盒子裡,讓你使用。
  • in 可迭代物件
    • 「可迭代物件(iterable)」是一個可以一個一個取出內容的東西,例如:range()list字串tuple、甚至字典(dict)。
    • 舉例來說:
      • range(5) → 會依序提供 0, 1, 2, 3, 4
      • ["apple", "banana", "cherry"] → 會依序提供 "apple", "banana", "cherry"
      • "Hello" → 會依序提供 "H", "e", "l", "l", "o"
  • 縮排區塊(要重複執行的程式)
    • 每次 for 迴圈抓到一個新值,就會執行這一塊縮排的程式碼。
    • 注意!縮排非常重要,Python 用縮排來判斷「哪些程式要被重複執行」。
    • 如果少了縮排,Python 就不知道哪些是迴圈內容,會直接報錯。(這邊要非常留意!)

範例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,然後執行縮排區塊。
  • 縮排在 Python 中非常重要,代表程式區塊,不要混用 tab/space。

注意:迴圈結束後變數還存在

很多新手會以為i 只在迴圈裡才有效,結束後就會消失
但在 Python 裡,i會保留最後一次的值喔!

我們看一下這邊的範例,你就會更清楚!

for i in range(3):
    print(i)

print("迴圈結束後 i =", i)

https://ithelp.ithome.com.tw/upload/images/20250925/20164721jcEQ8F3Mdu.png

五、常見可迭代物件(range/string/list)

除了 range(),for 也能跑其他東西喔!
其實 for 能用的不只是 range(),任何「可迭代物件 (iterable)」都能用。

1. range()(數字序列)

for i in range(1,6):   # 1 到 5
    print(i)

為了更清楚的解釋!我在這邊做了一張slide供參考:

https://ithelp.ithome.com.tw/upload/images/20250925/20164721YTtT84RANo.png

再來看看下面的例子!還記得昨天教的range()語法嗎?試著想想看!
https://ithelp.ithome.com.tw/upload/images/20250925/20164721nsuUcCAwMl.png

輸出內容和你心裡想的一樣嗎?如果是的話!恭喜你呦!
這樣可以把2到10之間2的倍數都印出來~

https://ithelp.ithome.com.tw/upload/images/20250925/20164721SQebOzSbY7.png

我們來打鐵趁熱!繼續來試試看這題練習~(先別急著看答案)

請用for迴圈 列印出以下的內容:
https://ithelp.ithome.com.tw/upload/images/20250925/20164721hx7kRJ1fNI.png

這邊我來引導一下這題的邏輯~讀者可以參考一下:

(1).可以先看成這段程式會讓電腦「從 1 數到 10」,每數到一個數字就把它的平方算出來並印出一行文字:例如 1 的平方是 1、2 的平方是 4⋯⋯直到 10 的平方是 100。

(2).有發現什麼規律嗎?

  • 第一欄的數字:從 1 開始,依序增加到 10。
  • 第二欄的數字:是前面那個數字的平方(例如 2 → 4、3 → 9、10 → 100)。
  • 中間的文字:固定是「的平方是」。

(3).那該如何從「 1 開始,一直到 10,每次加 1 」 呢?

這邊你應該會聯想到:

  • Python 有個工具叫 range(),可以自動幫我們生成一個數列。
  • 只要告訴它「起點」跟「終點」,它就會幫你數數字。

(4).利用for迴圈!

「既然 range(1, 11) 可以產生出 1 到 10,那我們就可以讓 for 把裡面的數字一個一個拿出來用。

答案:

for i in range(1, 11):
    print(i, "的平方是", i**2)

2. string(逐字處理)

for ch in "Python": #分別會把字母印出來
    print(ch)

輸出:

P
y
t
h
o
n

3.list 字串

nums = [2,4,6]
for n in nums:
    print(n * 2)

輸出:

4
8
12

4.字典dict

這邊之後會介紹到!

scores = {"Amy": 90, "Bob": 80, "Cindy": 95}
for name in scores:
    print(name, "的分數是", scores[name])

輸出:

Amy 的分數是 90
Bob 的分數是 80
Cindy 的分數是 95

5.索引 vs 直接元素

有時候我們想到「索引」來取元素,可以這樣寫:

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('判斷完成')

逐行拆解:

  1. len(country)

    • len() 是一個內建函數,用來計算「列表的長度」。
    • 這裡 len(country) = 4,因為 country 裡有 4 個元素。

    所以 range(len(country)) 等於 range(4),會產生 [0, 1, 2, 3]

  2. for num in range(len(country)):

    • 這行代表我們會讓 num 依序取值 0 → 1 → 2 → 3。
    • 換句話說,num 就是「索引值 (index)」,能幫我們找到 country 裡的元素。
  3. if country[num] in europe:

    • country[num]:依照索引,取出 country 裡的第 num 個國家。
    • in:用來判斷這個國家是不是存在於 europe 清單中。
  4. print(...)

    • 根據判斷結果,輸出「是」或「不是」。
  5. print('判斷完成')

    • 最後補上一句收尾,讓輸出更完整。

來看看完整的解答吧!

#判斷是否為歐洲國家
country = ['台灣', '日本', '英國', '馬來西亞']
europe = ['英國', '法國', '德國', '挪威']

for num in range(len(country)):
    if country[num] in europe:
        print(country[num] + '是歐洲國家')
    else:
        print(country[num] + '不是歐洲國家')
print('判斷完成')

len() 的小補充

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.忘記縮排

  • Python 靠縮排判斷「哪些程式要重複執行」。
  • 少一個空格就會報錯,甚至跑出奇怪的結果。
  • 建議固定用 4 個空格,不要混用 Tab。

3.誤會 i 的用途

  • i 不是什麼神秘符號,它只是個變數名字。
  • 你完全可以換成 numxapple
for apple in range(5):
    print(apple)

4.以為只能搭配數字

  • 其實 for 不只可以跑數字,還能跑字串(str)、list,甚至字典(dict)。
  • 例如:
for ch in "Python":
    print(ch)

5.忘記自己要印什麼

  • 有些人寫了 for,卻什麼都沒顯示,因為忘了寫 print()
  • 別忘了:for 只負責「走訪每個元素」,你還是要告訴電腦「要拿它來做什麼」。

6.少打冒號 :

for i in range(5)   # 缺冒號,會報錯

八、實戰演練

題目1:判斷下方字串中的子母音

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, "是子音")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250925/20164721L5eD9ldnkU.png

題目2: 速食店點餐

說明:

  • 先建立兩個list分別存取食物名稱和價格
  • 使用者輸入想買的東西,程式會檢查是否存在菜單。
  • 如果存在,加入購物清單並記錄價格;如果不存在,提示「沒有這個餐點」。(這邊假設不重新輸入)
  • 最後用 for 迴圈 計算購物清單的總金額。
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)若輸入的餐點都是在菜單上的話
https://ithelp.ithome.com.tw/upload/images/20250925/20164721t6YltZ23aw.png

(2)若輸入的餐點有不在菜單上的話:
https://ithelp.ithome.com.tw/upload/images/20250925/20164721Cg0DfPdrga.png

題目3:註冊登入系統

說明:

  1. 先準備兩個 list:一個存帳號(users),一個存密碼(pwds)。
  2. 程式先問使用者要「登入」還是「註冊」。
  3. 如果選擇登入:
    • 輸入帳號與密碼,檢查是否正確。
    • for 迴圈 去逐一比對。
    • 如果帳號存在且密碼正確,輸出「登入成功」。
    • 如果帳號存在但密碼錯誤,輸出「密碼錯誤」。
    • 如果找不到帳號,提示「帳號不存在」。
  4. 如果選擇註冊:
    • 輸入新帳號和密碼,加入 userspwds
    • 提示「註冊成功」。

小提醒:等之後學到 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)且登入成功:
https://ithelp.ithome.com.tw/upload/images/20250925/20164721o0VRGGAWO6.png

(2)若選擇登入功能(login)但登入失敗:
https://ithelp.ithome.com.tw/upload/images/20250925/20164721d6PQjkLZkt.png

(3)若選擇註冊(register)功能:
https://ithelp.ithome.com.tw/upload/images/20250925/20164721IbkJUvzkcl.png

今日小結

辛苦啦!相信今天的內容對新手來說應該是滿燒腦的!不過別擔心~我當初也花了很長時間才克服 for 迴圈!

以前我對 for 迴圈總是又怕又排斥,但它真的是學程式時絕對不能跳過的重點。
因為只要進入更大的專案,for 迴圈幾乎都是固定班底,天天會出現!

第一次學可能會覺得抽象、甚至頭昏腦脹,但只要多看幾遍、多做幾次練習,慢慢就能上手。等到用習慣之後,你會發現 for 迴圈超好用,隨時都能幫我們節省程式碼的長度!

今天我們實作了很多例子:

從「數字平方」、「字母逐字列印」,到「判斷列表元素是不是歐洲國家」,最後還有「小小實戰演練」。這些都讓我們更貼近 for 迴圈的使用場景。

總結來說,掌握 for 迴圈的精髓其實就是三件事:

  1. 抓元素:電腦會幫你依序抓出 list、string 或 range 裡的每個元素,不用自己數位置。
  2. 縮排很重要:Python 用縮排判斷哪些程式要重複執行,縮排錯了,整個迴圈就報錯。
  3. 搭配條件或 len():能更靈活地操作元素,例如依索引抓資料、判斷是否符合條件。

對新手來說,最常見的錯誤就是:忘記縮排、變數命名亂,或者把 for 用在不會自動產生序列的東西上。今天先把這些基本概念練熟,未來就能少走冤枉路!!

明天我們會挑戰更進階的技巧,讓 for 迴圈威力加倍!

如果你有問題,歡迎在下方留言;如果覺得這篇對你有幫助,也別忘了點個 Like~
你們的支持就是我持續創作的動力!

明日預告

明天我們要進一步學習:

  1. break 與 continue
    • 提早跳出迴圈或跳過當前迴圈。
  2. enumerate()
    • 同時取得元素的索引和值,非常實用。
  3. zip()
    • 將多個可迭代物件「配對」,一次處理多列資料。
  4. 巢狀 for 迴圈
    • 處理二維或多維資料結構,讓迴圈更靈活。

另外還會準備 完整的實戰範例與踩雷提醒,幫助大家掌握進階迴圈技巧!
一起加油,我們明天見!


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

尚未有邦友留言

立即登入留言