套餐永遠是飲料加杯型——正好兩個值,不會是三個。配料卻是一堆沒有順序、也不能重複的加料。哪種容器能用形狀把這兩件事說清楚?
列表不是 Python 裡唯一的集合型別。元組把固定數量的值組合起來,建立後不能修改;集合儲存唯一值,成員判斷很快。知道該選哪一種,程式碼的意圖會更清楚。 你還會回傳固定形狀的記錄、用集合判斷成員關係,並比較權限集合。
元組是固定記錄
元組用圓括號表示,保留值的順序。你可以按索引讀取,也可以一次解包到多個變數。元組建立後不能修改,因此適合坐標、鍵值對,或本來就應該保持不變的記錄。
point = (3, 5)
x, y = point
print(x + y)解包元組
集合儲存唯一值
set 會去掉重複項,但不保證顯示順序。當「是否唯一」或「是否存在」比位置更重要時,就用集合。把列錶轉成集合,是統計不同值的快捷方式。
orders = ["latte", "tea", "latte"]
unique = set(orders)
print(len(unique))
print("tea" in unique)去重與成員判斷
集合運算
& 取兩個集合的交集,| 取併集。需要穩定輸出順序時,先對結果排序。不要依賴集合本身的顯示順序。
a = {1, 2, 3}
b = {3, 4}
print(sorted(a & b))
print(sorted(a | b))交集與併集
元組是固定形狀,不是短列表
欄位數量本身就是含義時,用元組。divmod() 回傳商和餘數,解包可以一次給兩個名字。帶星號的目標會收集剩下的值,適合「表頭加可變尾部」的記錄。
quotient, remainder = divmod(17, 5)
print(quotient, remainder)
record = ("2026-10-28", "latte", 4.5, "paid")
date, drink, *rest = record
print(date, drink)
print(rest)形狀固定時,按位置解包
集合回答的是成員問題
集合去重,並能快速回答 in。它不保證插入順序,所以顯示前先排序。需要歷史順序或保留重複項時,仍然用列表;只有「唯一」是目標時才轉成集合。
visits = ["home", "menu", "home", "checkout"]
unique_pages = set(visits)
print(len(unique_pages))
print(sorted(unique_pages))
print("menu" in unique_pages)
print("help" in unique_pages)唯一值,不是時間線
用子集和差集比較權限
集合運算可以表達權限規則。required <= granted 問的是「必需權限是否齊全」;granted - required 列出多餘項,required - granted 列出缺口。交集非空,比子集判斷弱得多。
required = {"read", "write"}
granted = {"read", "write", "admin"}
print(required <= granted)
print(sorted(granted - required))
print(sorted(required - granted))
print(sorted(required ^ granted))子集判斷權限是否完整
本課要點
- 元組保留順序,不能原地修改。
- 元組解包會把每個值賦給一個變數。
- 集合去重,並支援快速的成員判斷。
- 需要順序時,列印集合前先排序。
- 固定記錄用元組,唯一性和成員判斷用集合。
常見錯誤
- 試圖對元組呼叫 append,而不是建立新元組。
- 以為集合會保留原列表順序。
- 只關心值是否存在時,仍然使用列表。
- 只檢查交集是否非空,卻忘了每個必需權限都要存在。
建立一個包含名稱和價格的元組,解包後列印格式化句子。
動手試試
改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。
練習本課
12 道題,作答後立即看到解釋。