
在 Python 程式設計中,元組 (tuple) 是一種與串列 (list) 非常相似的序列型別,但具有關鍵的區別:元組是不可變的 (immutable)。本文將詳細介紹 Python 元組的定義、建立方式、基本操作、特性、與串列的比較,以及實際應用。
什麼是元組 (tuple)?
元組是由一系列按照特定順序排列的元素組成的資料結構。元組具有以下特點:
- 有序性 (Ordered): 元組中的元素有固定的順序,可以透過索引 (index) 存取。
- 不可變性 (Immutable): 元組一旦建立後,就不能修改其內容 (不能新增、刪除或修改元素)。
- 異質性 (Heterogeneous): 元組中的元素可以是不同的資料型別。
在 Python 中,元組屬於 tuple 型別。
建立元組
有幾種方式可以建立元組:
- 使用小括號 () (最常見): 將元素用逗號分隔,並放在小括號中。
- 使用 tuple() 函數: 將其他可迭代物件 (例如字串、串列) 轉換為元組。
# 使用小括號 ()
my_tuple = (1, 2, 3, 4, 5)
fruits = ('apple', 'banana', 'orange')
mixed_tuple = (1, 'hello', True, 3.14)
empty_tuple = ()
# 使用 tuple() 函數
string = "Hello"
char_tuple = tuple(string) # 結果: ('H', 'e', 'l', 'l', 'o')
list_data = [10, 20, 30]
tuple_from_list = tuple(list_data) # 結果: (10, 20, 30)
# 單元素元組
single_element_tuple = (5,) # 注意這個逗號!
print(type(my_tuple)) # 輸出: <class 'tuple'>
重要觀念: 建立只有一個元素的元組時,必須在元素後面加上逗號,例如 (5,)。如果沒有逗號,(5) 會被 Python 解釋為整數 5,而不是元組。
元組的基本操作
元組支援的操作與串列類似,但由於元組的不可變性,不能進行修改操作:
1. 索引 (Indexing) 與切片 (Slicing)
與串列相同,使用方括號 [] 和索引 (從 0 開始) 存取元素,或使用 [start:end:step] 提取元組的一部分。
my_tuple = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# 索引
print(f"my_tuple[0] -> {my_tuple[0]}") # 輸出: 0
print(f"my_tuple[-1] -> {my_tuple[-1]}") # 輸出: 9 (負數索引)
# 切片
print(f"my_tuple[2:5] -> {my_tuple[2:5]}") # 輸出: (2, 3, 4)
print(f"my_tuple[::2] -> {my_tuple[::2]}") # 輸出: (0, 2, 4, 6, 8)
2. 其他常用操作
元組支援多種不會改變自身的內建函數與方法。
tuple1 = (1, 2, 3, 1)
tuple2 = (4, 5, 6)
print(f"len(tuple1) -> {len(tuple1)}") # 輸出: 4
print(f"tuple1 + tuple2 -> {tuple1 + tuple2}") # 輸出: (1, 2, 3, 1, 4, 5, 6)
print(f"tuple1 * 2 -> {tuple1 * 2}") # 輸出: (1, 2, 3, 1, 1, 2, 3, 1)
print(f"1 in tuple1 -> {1 in tuple1}") # 輸出: True
print(f"tuple1.index(2) -> {tuple1.index(2)}") # 輸出: 1
print(f"tuple1.count(1) -> {tuple1.count(1)}") # 輸出: 2
元組的不可變性 (Immutability)
元組最重要的特性是不可變性。這意味著一旦建立了元組,就不能修改它的內容。
my_tuple = (1, 2, 3)
# 以下操作都會引發錯誤
# my_tuple[0] = 10 # TypeError: 'tuple' object does not support item assignment
# my_tuple.append(4) # AttributeError: 'tuple' object has no attribute 'append'
# del my_tuple[0] # TypeError: 'tuple' object doesn't support item deletion
不可變性的優點
- 資料安全性: 元組的不可變性可以確保資料不會在程式執行過程中被意外修改。
- 效能: 因為不可變,Python 內部可以對元組進行效能優化,通常元組的迭代速度會比串列稍快。
- 可雜湊性 (Hashable): 元組可以用作字典的鍵 (key) 或集合的元素,而可變的串列則不行。
元組 vs. 串列
了解元組和串列的差異,有助於您在開發時做出正確的選擇。
特性 | 元組 (tuple) | 串列 (list) |
---|---|---|
可變性 | 不可變 (immutable) | 可變 (mutable) |
建立語法 | () 或 tuple() | [] 或 list() |
修改 | 不允許 | 允許 (新增、刪除、修改) |
效能 | 通常比串列略快 | 略慢 |
可雜湊性 | 可雜湊 (可作字典鍵) | 不可雜湊 |
主要用途 | 儲存固定不變的資料集合 | 儲存需要動態修改的資料集合 |
元組的應用
- 表示固定不變的資料: 例如,座標 (x, y)、日期 (年, 月, 日)、RGB 顏色 (紅, 綠, 藍) 等。
- 作為字典的鍵: 因為元組是不可變且可雜湊的。
- 函數返回多個值: 函數可以返回一個元組,來間接實現返回多個值的效果。
- 資料安全性: 當您希望確保傳遞的資料不會被修改時,可以使用元組。
- 格式化字串 (舊式): 可以利用元組來進行字串格式化。
# 函數返回多個值 (實際上是返回一個元組)
def get_name_and_age():
return "Alice", 30 # 相當於 return ("Alice", 30)
# 元組解包 (Tuple Unpacking)
name, age = get_name_and_age()
print(f"Name: {name}, Age: {age}") # 輸出: Name: Alice, Age: 30
# 作為字典的鍵
location_data = {
(35.6895, 139.6917): "Tokyo",
(40.7128, -74.0060): "New York"
}
# 格式化字串
print("姓名:%s, 年齡:%d" % ("Bob", 25))
總結
Python 的元組 (tuple) 是一種有序、不可變的序列型別。雖然它的操作方法沒有串列那麼豐富,但其「不可變性」帶來了資料安全、效能優化以及可作為字典鍵等重要優勢。了解元組的特性以及與串列的區別,可以幫助您在適當的場景下選擇最合適的資料結構,寫出更安全、更有效率的程式碼。