iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0

前言

嗨囉~又見面啦!昨天我們玩了 while 迴圈的進階技巧,學會了:

  • 動態條件控制
  • while True + break 的無窮迴圈
  • while … else 的特殊用法
  • continue 跳過不符合條件的輸入

還實作了 選課系統,透過動態 List 控制迴圈流程!!應該蠻有成就感的吧?

經過一個禮拜的「迴圈轟炸」,是不是有點頭暈了呢?(你沒暈我也頭暈了!)
沒關係!今天我們換換主題,來看看集合型態的另一個成員:Tuple(元組)

回想一下,在 Day9 我們初登場了集合型態的 List(串列)
之後在講 forwhile 迴圈時,它一直是我們範例的固定班底。
(可以去回顧一下!)

Tuple 常常會和 List 放在一起比較。

今天,我們就來深入了解:

  • Tuple(元組)是什麼
  • 它和 List 的不同點
  • 以及在程式中應該怎麼選擇使用

一起來看看吧!

一、Tuple 是什麼?(小括號表示)

Tuple(元組)可以想像成 「固定不動的清單」

它和 List 很像,也能放多個元素,還可以存不同資料型態
(數字、字串、布林、甚至 List),但有個大不同:

Tuple 一旦建立,就不能修改(不可新增、刪除或改變元素)。

# 小括號表示 tuple
my_tuple = (10, 20, 30)
print(my_tuple)
print(type(my_tuple))  # <class 'tuple'>

輸出:

(10, 20, 30)
<class 'tuple'>

List 與 Tuple 的差異整理

特性 List Tuple
可否修改 可變 不可變
語法 [] ()
用途 任務清單、動態資料 固定資料、設定值、字典 key
效能 一般 稍快,因為不可變

小提醒:

Tuple 就像書本的章節順序固定,不會隨便被換頁;
List 就像可自由編排的記事本。

二、Tuple 的基本操作

1.取值(索引與切片)

t = ("Python", "C", "Java")
print(t[0])     # Python
print(t[-1])    # Java
print(t[0:2])   # ('Python', 'C')

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721BM4dKu6QHM.png

  • 索引、切片和 List 一模一樣

  • 可以用 len() 取得長度

print(len(t))  # 3

不可修改

t = (1, 2, 3)
t[0] = 100  # 會報錯!TypeError: 'tuple' object does not support item assignment

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721toU7YBD2b7.png

3.單元素Tuple

single = (5,)  # 注意後面要加逗號
print(type(single))  # <class 'tuple'>

如果寫成 (5) → Python 會當作數字,不是 tuple

4.Tuple 與List 相互轉換

l = [1, 2, 3]
t = tuple(l)  # List → Tuple
print(t)      # (1, 2, 3)

l2 = list(t)  # Tuple → List
print(l2)     # [1, 2, 3]

這個功能很實用,當你需要「暫時固定」資料時可以轉成 tuple!

5.count(x) → 計算某個值出現幾次

nums = (1, 2, 2, 3, 2, 4)
print(nums.count(2))   # 3,因為 2 出現三次

6.index(x) → 找到某個值的「第一個位置」

nums = (1, 2, 3, 4, 2)
print(nums.index(2))   # 1 (第一個 2 出現在位置 1)

⚠️ 注意:如果要找的值不存在,會報錯:

nums = (1, 2, 3)
print(nums.index(9))   # ❌ ValueError

輸出:

https://ithelp.ithome.com.tw/upload/images/20250930/20164721Avv4S0swCL.png

三、為什麼要用 Tuple?

  1. 資料不可更改時更安全
    • 用 Tuple 儲存設定值或固定資料,避免被程式其他地方意外修改
  2. 效能稍快
    • Tuple 因為不可變,操作時比 List 稍微省資源
  3. 可當作字典的 key
    • List 不行,Tuple 可以 → 用於需要不可變的場景

四、進階操作範例

1.遍歷 Tuple 與 List

fruits_list = ["蘋果", "香蕉", "橘子"]
fruits_tuple = ("蘋果", "香蕉", "橘子")

# List 遍歷
for f in fruits_list:
    print(f"List: {f}")

print("====我是分隔線====")

# Tuple 遍歷
for f in fruits_tuple:
    print(f"Tuple: {f}")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721nw7TNN61jk.png

注意:遍歷方式完全一樣,Tuple 只是不能修改元素。

2.嘗試修改 Tuple(會報錯)

fruits_tuple = ("蘋果", "香蕉", "橘子")
try:
    fruits_tuple[0] = "西瓜"
except TypeError as e:
    print("錯誤:", e)

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721oMm9bXgp4b.png

3.Tuple 作為字典 key

# List 不能當 key,但 Tuple 可以
location = {}
coord = (25.03, 121.56)  # 台北經緯度
location[coord] = "Taipei"
print(location)
  • Tuple 不可變 → 可以作為字典的 key
  • List 可變 → 不能作為 key,會報錯

輸出:

https://ithelp.ithome.com.tw/upload/images/20250930/20164721XSSNRecDoi.png

4.List + Tuple 混合使用

# 生日清單
students = [("小明", "2008-05-12"), ("小華", "2008-08-23")]

# 遍歷
for name, birthday in students:
    print(f"{name} 生日是 {birthday}")

Tuple 在這裡就像「固定資料包」,List 是外層清單可以動態增刪學生。

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721qvnDBMivtu.png

5.解構 (Tuple Unpacking)

所謂「解構」就是把一個 Tuple 的元素,直接拆開後分別指定給多個變數。

這樣可以讓程式碼更直觀,不用一個一個用索引取值。

student = ("20250929", "Sharon")

# 一次拆成兩個變數
sid, name = student  

print(sid)   # 輸出: 20250929
print(name)  # 輸出: Sharon

💡 小技巧:
如果 Tuple 的元素比變數多,可以用_忽略不需要的值:

data = ("Alice", 20, "Taipei")
name, _, city = data
print(name, city)   # 輸出: Alice Taipei

五、實戰演練+解析

這邊先看一下完整的程式碼:

# 學生資料 (Tuple)
students = [
    ("20250929", "Sharon"),
    ("20250930", "Bob"),
    ("20251001", "Charlie")
]

# 課程清單
courses = ["Python", "C", "Java", "HTML", "CSS"]

print("=== 學生選課系統 ===")
student_id = input("請輸入學生編號:")

# 檢查學生是否存在
for sid, name in students:
    if sid == student_id:
        print(f"✅ 歡迎 {name} (ID: {sid})")
        selected = []

        while len(selected) < 3:
            print("\n可選課程:")
            for i, c in enumerate(courses, 1):
                print(f"{i}. {c}")

            try:
                choice = int(input("請輸入課程編號:"))
            except ValueError:
                print("⚠️ 請輸入數字")
                continue

            if 1 <= choice <= len(courses):
                course = courses[choice-1]
                if course in selected:
                    print(f"⚠️ {course} 已選過")
                    continue
                selected.append(course)
                print(f"✅ 選擇 {course}")
            else:
                print("⚠️ 編號無效")

        print(f"\n🎉 {name} (ID: {sid}) 選課完成!")
        print("選課結果:", selected)
        break
else:
    print("❌ 查無此學生,請確認學號是否正確")

完整輸出:

https://ithelp.ithome.com.tw/upload/images/20250930/20164721djp0bo2cqa.png

接下來我會對每個程式區塊做解析!一起來看看~

1. 建立學生與課程資料

students = [
    ("20250929", "Sharon"),
    ("20250930", "Bob"),
    ("20251001", "Charlie")
]
courses = ["Python", "C", "Java", "HTML", "CSS"]
  • studentsTuple 保存學號 + 姓名,保證資料不會被修改。
  • courses 是一個 list,放所有可選課程。

2.學生登入驗證

student_id = input("請輸入學生編號:")
for sid, name in students:
    if sid == student_id:
        ...
        break
else:
    print("❌ 查無此學生,請確認學號是否正確")
  • 使用者輸入 student_id
  • for 迴圈逐一檢查 students 中的 tuple,看學號是否存在。
  • 如果找到 → 顯示歡迎訊息並進入選課流程。
  • 如果整個迴圈都沒找到 → 執行 else,輸出「查無此學生」。

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721RWp4nR0WUD.png

https://ithelp.ithome.com.tw/upload/images/20250930/20164721JSOGI9ckU6.png

3.選課流程

selected = []
while len(selected) < 3:
    print("\n可選課程:")
    for i, c in enumerate(courses, 1):
        print(f"{i}. {c}")
  • 每個學生最多可以選 3 門課 → 條件是 len(selected) < 3
  • enumerate 把課程依序列出來給學生選。

https://ithelp.ithome.com.tw/upload/images/20250930/20164721SZUWpymRYw.png

4.使用者輸入課程編號

choice = int(input("請輸入課程編號:"))
  • try-except 確保輸入必須是數字,否則提示錯誤並 continue 回去重來。(之後會再介紹 try-except)
  • 如果輸入合法,就檢查:
    1. 是否在有效範圍內
    2. 是否已經選過

5.選課成功或錯誤處理

if 1 <= choice <= len(courses):
    course = courses[choice-1]
    if course in selected:
        print(f"⚠️ {course} 已選過")
        continue
    selected.append(course)
    print(f"✅ 選擇 {course}")
else:
    print("⚠️ 編號無效")
  • 合法課程編號 → 確認是否已經選過:
    • 有選過 → 提示錯誤,continue
    • 沒選過 → 加進 selected,顯示「成功選擇」。
  • 編號不在範圍內 → 提示「無效」。

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721lSwAXgX2xd.png

6.選課完成

print(f"\n🎉 {name} (ID: {sid}) 選課完成!")
print("選課結果:", selected)

• 當 while 條件結束(選滿 3 門課)後,輸出學生選課結果。

輸出:
https://ithelp.ithome.com.tw/upload/images/20250930/20164721oY2H1Cibv1.png

結語

今天我們認識了集合型態家族裡的新角色:Tuple(元組)
它跟 List 長得很像,但有一個超關鍵差異——一旦建立就不能改!

List:適合放「會變動」的資料(例如課程清單、購物車)
Tuple:適合放「固定不變」的資料(例如學生 ID、地理座標)

我們也實際動手學了幾招:

  • 基本操作:索引、切片、count()、index()。

  • 互轉技巧:List ↔ Tuple 轉換。

  • 進階應用:

解構 (Unpacking),一次拆成好幾個變數。
當作字典 key,利用它不可變的特性。

最後我們在實戰演練中利用學生選課系統這個範例把概念串起來:

  • 學生 ID 用 Tuple 保護不被改動
  • 課程清單用 List 讓學生自由選修

這樣搭配下來,剛好展現了 Tuple 的穩定性 和 List 的靈活性。
下次如果你需要「有些東西要鎖死,有些東西要能改」的場景,就知道該怎麼選啦!

那麼,今天辛苦啦!我們明天見呦~


上一篇
【Day15】while 進階攻略:無窮迴圈 × while-else 用法
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言