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,) 只差一個逗號,結果完全不同。
不可變:改不了,但可以組出新的
元組建立後,不能把某個位置換成別的值,也不能刪除元素。寫 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 改指向它。
改動與否,看最後改動的對象
元組的元素可以是串列。看右邊的箭頭:元組的第 2 格指向一個串列物件。第 5 行和第 10 行改的都是那個串列,元組始終指向同一個串列,所以不會出錯。
可變與不可變物件
判斷「能不能改」時,要看最後被改動的那個物件是什麼型態:
| 不可變(immutable) | 可變(mutable) |
|---|---|
數字:int、float、complex |
串列 list |
字串 str |
字典 dict |
元組 tuple |
集合 set |
凍結集合 frozenset |
bytearray |
想一想:建立與修改
下面的程式會印出什麼?
a = (50)
b = (50,)
print(type(a).__name__, type(b).__name__)
下面的程式會印出什麼?
t = (1, [2, 3])
t[1].append(4)
print(t)
執行下面的程式,結果是什麼?
t = (10, 20, 30)
t[0] = 99
print(t)
打包與解包、交換變數
x, y = point 一次指派兩個變數,左右兩邊的個數必須相同。第 12 行 a, b = b, a 是 Python 交換兩個變數的慣用寫法,不需要暫存變數。
元組相關的函數與方法
max、min、sorted 要求元素可以互相比較(通常是相同型態);sum 要求元素是數值。注意第 4 行:sorted() 傳回的是串列,不是元組。
追蹤解包與切片
下面的程式會印出什麼?
a, b, c = 1, 2, 3
a, c = c, a
print(a, b, c)
下面的程式會印出什麼?
tup = tuple("Hello Python")
print(tup[1:10:3])
實作:用元組整理成績
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。