Minghsin University of Science and Technology
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try a Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

1

Local AI

--

Uedu Code

--

明新科大 AQI 69 24°C PM2.5 26
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 10

元組(Tuple)

有序、不可變的容器:打包與解包
Interaction實作 15 minute(s)

Learning Objectives

  • 元組(tuple)的宣告與運算:有順序、內容不可改變
  • 用索引與切片取得元組的資料,用舊元組組出新元組
  • 打包與解包:一次指派多個變數、交換兩個變數
  • 元組相關的函數與方法:len、max、min、sum、sorted、count、index

為什麼需要元組

上一課的串列(list)可以隨時新增、修改、刪除元素。但有些資料一旦決定就不該再變: 一個座標 (3, 4)、一筆「科目與分數」的配對、一週的七天。這時候用元組(tuple)更合適。

串列(list) 元組(tuple)
寫法 [1, 2, 3] (1, 2, 3)
有順序、可索引與切片 是 是
建立後可以修改內容 可以(mutable) 不行(immutable)
常見用途 會增減的一串資料 固定的一組值、函數一次傳回多個值

元組不能被修改,所以把它交給別的程式使用時,不用擔心內容被改掉。

建立元組與取得資料

一行一行播放,注意右邊每個名稱指向的物件標示為 tuple 還是 int。特別看第 6 行和第 7 行:(50) 與 (50,) 只差一個逗號,結果完全不同。

互動練習:元組的切片

元組的索引與切片規則和字串、串列完全相同。拖曳 start、stop、step,看選到哪些元素。小工具以中括號顯示資料;換成元組時寫法一樣是 tp[1:3],只是結果會是元組,例如 ('apple', 'grape')。試試看 tp[-2] 在哪個位置,以及 step 設成 -1 會怎樣。

不可變:改不了,但可以組出新的

元組建立後,不能把某個位置換成別的值,也不能刪除元素。寫 tup1[0] = 100 會得到:

TypeError: 'tuple' object does not support item assignment

想要「不一樣的元組」時,做法是用舊的元組產生一個新的元組:

運算 結果 說明
len((10, 20, 30)) 3 元組個數(這裡的括號不能省略)
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 結合
('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') 重複
30 in (10, 20, 30) True 成員運算

想修改元組會發生什麼事

第 5 行會引發 TypeError,被 except 接住後程式繼續執行。接著看第 14 行:tup1 = tup1 + (78,) 並沒有修改原本的元組,而是建立新元組,再讓 tup1 改指向它。

元組裡放了串列

按 t[0] = 9 會被拒絕;再按 t[1].append(4),看看為什麼可以成功。關鍵在於:元組存的是「指向串列的參照」,參照本身沒有變。

改動與否,看最後改動的對象

元組的元素可以是串列。看右邊的箭頭:元組的第 2 格指向一個串列物件。第 5 行和第 10 行改的都是那個串列,元組始終指向同一個串列,所以不會出錯。

可變與不可變物件

判斷「能不能改」時,要看最後被改動的那個物件是什麼型態:

不可變(immutable) 可變(mutable)
數字:int、float、complex 串列 list
字串 str 字典 dict
元組 tuple 集合 set
凍結集合 frozenset bytearray

想一想:建立與修改

1.

下面的程式會印出什麼?

a = (50)
b = (50,)
print(type(a).__name__, type(b).__name__)
2.

下面的程式會印出什麼?

t = (1, [2, 3])
t[1].append(4)
print(t)
3.

執行下面的程式,結果是什麼?

t = (10, 20, 30)
t[0] = 99
print(t)
第 1 次作答

打包與解包、交換變數

x, y = point 一次指派兩個變數,左右兩邊的個數必須相同。第 12 行 a, b = b, a 是 Python 交換兩個變數的慣用寫法,不需要暫存變數。

元組相關的函數與方法

max、min、sorted 要求元素可以互相比較(通常是相同型態);sum 要求元素是數值。注意第 4 行:sorted() 傳回的是串列,不是元組。

追蹤解包與切片

1.

下面的程式會印出什麼?

a, b, c = 1, 2, 3
a, c = c, a
print(a, b, c)
2.

下面的程式會印出什麼?

tup = tuple("Hello Python")
print(tup[1:10:3])
第 1 次作答

實作:用元組整理成績

records 是一個由 (科目, 分數) 元組組成的串列。請用 for 迴圈解包每一筆資料,把分數收集成一個元組 scores,最後印出 scores、最高分與平均(sum 除以 len)。

你的輸出
預期輸出

重點精華回顧

  • 元組(tuple)有順序、內容不可改變;用小括號與逗號建立,元素型態可以不同。
  • 單一元素的元組一定要加逗號:(50,);(50) 只是整數。
  • 索引與切片的規則和字串、串列相同,切片的結果仍是元組。
  • 不能修改元素,但可以用 +、* 從舊元組產生新元組。
  • 元組裡放可變物件(例如串列)時,那個串列仍然可以改;能不能改,看最後改動的對象。
  • 打包 p = 3, 4、解包 x, y = p、交換 a, b = b, a。
  • 常用函數:len、max、min、sum、sorted(回傳串列)、tuple();方法:count、index。
這一課完成了!
Next lesson:字典(Dict)
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。