> Python 資料結構教學 | Spaxe

Python 資料結構完整教學

深入學習 Python 的核心資料結構:列表、字典、元組、集合、函數與例外處理機制。本教學將帶領您從基礎到進階,掌握 Python 程式設計的必備技能。

一、列表(List)

列表是 Python 中最基本且最常用的資料結構。它是一個有序、可變的集合,可以儲存不同類型的元素。建立列表使用方括號 [],元素之間以逗號分隔。

1.1 建立與基本操作

# 建立列表
fruits = ["蘋果", "香蕉", "橘子"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "你好", 3.14, True]

print(fruits)      # 輸出: ['蘋果', '香蕉', '橘子']
print(numbers[0])  # 輸出: 1
print(fruits[-1])  # 輸出: 橘子(倒數第一個)

1.2 列表常用方法

# 新增元素
fruits.append("葡萄")      # 末端新增
fruits.insert(1, "草莓")   # 在索引1位置插入

# 刪除元素
fruits.remove("香蕉")      # 移除指定值
popped = fruits.pop()      # 移除末端元素並返回

# 排序與反轉
numbers.sort()            # 原地排序
numbers.reverse()         # 原地反轉

# 其他常用操作
len(fruits)               # 列表長度
fruits.count("蘋果")      # 計算元素數量
fruits.index("橘子")      # 取得元素索引
💡 小提示:列表是可變的(mutable),這意味著您可以直接修改列表中的元素,而不需要創建新的列表。

二、字典(Dictionary)

字典是一個鍵值對(key-value)的無序集合。每個鍵都唯一對應一個值,類似於現實生活中的字典查找功能。建立字典使用花括號 {}

2.1 建立與訪問

# 建立字典
person = {
    "name": "小明",
    "age": 25,
    "city": "台北"
}

# 訪問值
print(person["name"])      # 輸出: 小明
print(person.get("age"))   # 輸出: 25

# 使用 get 方法的安全訪問
print(person.get("job", "未知"))  # 輸出: 未知(鍵不存在時)

2.2 字典操作

# 新增/修改鍵值對
person["job"] = "工程師"   # 新增
person["age"] = 26         # 修改

# 刪除鍵值對
del person["city"]         # 刪除指定鍵
popped = person.pop("age") # 刪除並返回值

# 遍歷字典
for key, value in person.items():
    print(f"{key}: {value}")

# 其他常用方法
person.keys()             # 所有鍵
person.values()           # 所有值
person.items()            # 所有鍵值對
person.clear()            # 清空字典
💡 小提示:字典的鍵必須是不可變類型,如字串、數字或元組,但不能使用列表作為鍵。

三、元組(Tuple)

元組與列表類似,但它是不可變的(immutable)。一旦創建後就不能修改,這使得元組適合儲存不應該被改變的資料。元組使用圓括號 () 建立。

3.1 基本用法

# 建立元組
coordinates = (10, 20)
rgb_color = (255, 128, 0)
single_item = (42,)  # 單元素元組需要逗號

# 訪問元素
print(coordinates[0])    # 輸出: 10
print(coordinates[1])    # 輸出: 20

# 解包(Unpacking)
x, y = coordinates
print(f"x={x}, y={y}")   # 輸出: x=10, y=20

3.2 元組 vs 列表

特性元組列表
語法()[]
可變性不可變可變
效能較快較慢
用途固定資料、座標動態集合

四、集合(Set)

集合是一個無序且不重複的元素集合。當您需要儲存唯一值或進行集合運算(如聯集、交集)時,集合是最佳選擇。建立集合使用花括號 {},但不以鍵值對形式。

4.1 基本操作

# 建立集合
fruits_set = {"蘋果", "香蕉", "橘子"}
numbers_set = {1, 2, 3, 4, 5}

# 添加與移除
fruits_set.add("葡萄")        # 添加元素
fruits_set.remove("香蕉")     # 移除元素(不存在會報錯)
fruits_set.discard("草莓")    # 移除元素(不存在不報錯)

# 集合運算
a = {1, 2, 3}
b = {2, 3, 4}
print(a | b)    # 聯集: {1, 2, 3, 4}
print(a & b)    # 交集: {2, 3}
print(a - b)    # 差集: {1}
print(a ^ b)    # 對稱差集: {1, 4}

4.2 去重與成員判斷

# 快速去除重複元素
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_data = list(set(data))
print(unique_data)  # 輸出: [1, 2, 3, 4]

# 成員判斷(非常高效)
print(3 in numbers_set)    # 輸出: True
print(10 in numbers_set)   # 輸出: False

五、函數(Function)

函數是組織程式碼的基本單位,它允許您將可重複使用的程式碼封裝起來。Python 使用 def 關鍵字來定義函數。

5.1 基本函數定義

# 基本函數
def greet(name):
    """問候函數"""
    return f"你好,{name}!"

# 帶預設參數的函數
def power(base, exponent=2):
    """計算次方,預設為平方"""
    return base ** exponent

# 呼叫函數
message = greet("小明")
print(message)              # 輸出: 你好,小明!
print(power(3))             # 輸出: 9
print(power(3, 3))          # 輸出: 27

5.2 多返回值與不定參數

# 多返回值
def get_stats(numbers):
    """返回多個統計值"""
    return min(numbers), max(numbers), sum(numbers)

min_val, max_val, total = get_stats([1, 5, 3, 9, 2])
print(f"最小: {min_val}, 最大: {max_val}, 總和: {total}")

# 不定數量的參數
def sum_all(*args):
    """接受任意數量的引數"""
    total = 0
    for num in args:
        total += num
    return total

print(sum_all(1, 2, 3))        # 輸出: 6
print(sum_all(1, 2, 3, 4, 5)) # 輸出: 15

# 關鍵字參數
def print_info(**kwargs):
    """接受任意數量的關鍵字引數"""
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="小明", age=25, city="台北")

5.3 匿名函數(Lambda)

# Lambda 表達式
square = lambda x: x ** 2
print(square(5))  # 輸出: 25

# 與內建函數配合
numbers = [1, 5, 3, 9, 2]
sorted_nums = sorted(numbers, reverse=True)
print(sorted_nums)  # 輸出: [9, 5, 3, 2, 1]

# 使用 lambda 進行自訂排序
students = [("小明", 85), ("小華", 92), ("小美", 78)]
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
print(sorted_students)  # 輸出: [('小華', 92), ('小明', 85), ('小美', 78)]

六、例外處理(Exception Handling)

例外處理是程式設計中不可或缺的一環。它讓您能夠優雅地處理錯誤情況,避免程式突然崩潰。Python 使用 try...except 語句來處理例外。

6.1 基本例外處理

# 基本語法
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"錯誤:{e}")  # 輸出: 錯誤:division by zero

# 多重例外處理
try:
    number = int(input("請輸入數字:"))
    result = 100 / number
except ValueError:
    print("請輸入有效的數字!")
except ZeroDivisionError:
    print("不能除以零!")
except Exception as e:
    print(f"發生錯誤:{e}")

6.2 else 與 finally

# else:當沒有發生例外時執行
try:
    num = int("123")
except ValueError:
    print("轉換失敗")
else:
    print(f"成功轉換:{num}")  # 輸出: 成功轉換:123

# finally:無論是否發生例外都會執行
try:
    file = open("data.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("檔案不存在")
finally:
    print("清理資源...")  # 確保資源釋放

6.3 自訂例外

# 定義自訂例外
class AgeError(Exception):
    """年齡驗證例外"""
    def __init__(self, age, message="年齡不在有效範圍內"):
        self.age = age
        self.message = message
        super().__init__(self.message)

# 使用自訂例外
def validate_age(age):
    if age < 0 or age > 150:
        raise AgeError(age)
    return True

try:
    validate_age(-5)
except AgeError as e:
    print(f"錯誤:年齡 {e.age} {e.message}")

6.4 常見例外類型

例外類型說明
SyntaxError語法錯誤
NameError變數未定義
TypeError類型不匹配
IndexError索引超出範圍
KeyError字典鍵不存在
FileNotFoundError檔案不存在
ValueError值不合法

七、資料結構比較與選擇

了解每種資料結構的特性後,選擇合適的結構能讓程式更高效、更易維護。以下是各資料結構的適用場景:

資料結構特性適用場景
列表 List有序、可變、重複有序集合、需要索引訪問
字典 Dict無序、鍵值對、快速查找需要快速透過鍵查找
元組 Tuple有序、不可變、重複固定資料、座標、多返回值
集合 Set無序、唯一值去重、集合運算、成員判斷

✏️ 練習題

  1. 列表操作:建立一個包含 1-10 數字的列表,找出其中的偶數並計算它們的總和。
  2. 字典應用:建立一個通訊錄字典,包含姓名和電話。新增、刪除和查詢聯絡人的功能。
  3. 元組解包:有一個座標元組 (100, 200),使用解包語法將 x 和 y 分別取出。
  4. 集合運算:给定兩個集合 A = {1, 2, 3, 4}B = {3, 4, 5, 6},找出兩集合的交集並計算元素數量。
  5. 函數設計:撰寫一個計算 BMI 的函數,輸入身高(公分)和體重(公斤),返回 BMI 值並標註健康狀態(過輕/正常/過重/肥胖)。
  6. 例外處理:撰寫一個安全的除法函數,當除數為零時不回傳錯誤,而是回傳 None 並打印提示訊息。
  7. 綜合挑戰:建立一個學生成績管理系統,使用字典儲存多個學生的成績,每個學生有姓名和分數列表,計算每位學生的平均分數並找出最高分學生。

八、總結與後續學習

在本教學中,我們深入探討了 Python 的五大核心資料結構:列表、字典、元組、集合,以及函數的定義與使用。同時也學習了例外處理機制,這些都是 Python 程式設計的基礎。

掌握這些知識後,您可以進一步學習:

建議您多多練習,将這些概念應用到實際項目中。熟能生巧,只有通過不斷的實踐,才能真正掌握 Python 資料結構的精髓。