🐍 Bài Giảng 3: Tuple và Dictionary

2 kiểu dữ liệu cực kỳ quan trọng khác ngoài List, đó là **Tuple** (bộ) và **Dictionary** (từ điển). Chúng sẽ giúp tổ chức dữ liệu một cách hiệu quả và an toàn hơn!

🎯 Mục Tiêu Bài Giảng

Kiến thức

  • Phân biệt sự khác biệt cốt lõi giữa List (thay đổi được) và Tuple (KHÔNG thay đổi được).
  • Hiểu khái niệm "cặp Key-Value" và cách Dictionary tổ chức dữ liệu.

Kỹ năng

  • Biết cách tạo và truy xuất Tuple.
  • Biết cách tạo, truy xuất, thêm, cập nhật và xóa dữ liệu trong Dictionary.

⏱️ Phân Bổ Thời Gian (120 phút)

Tuple giống List ở điểm nào, và tại sao nó lại được gọi là "bất biến" (immutable)!

1. Khái niệm Tuple (Bộ)

Tuple (đọc là /'tʌpəl/ hoặc /'tju:pəl/) là một cấu trúc dữ liệu gần giống hệt List.

  • Giống List: Có thứ tự, cho phép các phần tử trùng lặp, truy xuất bằng index.
  • Khác List: Tuple **KHÔNG THỂ THAY ĐỔI** (immutable) sau khi đã tạo.

Tại sao dùng Tuple?

Khi muốn dữ liệu được an toàn, không bị vô tình sửa đổi. Ví dụ: tọa độ (x, y), thông tin ngày sinh, các hằng số cài đặt...

2. Tạo và Truy xuất Tuple

Chúng ta dùng dấu ngoặc đơn `()` để tạo Tuple (thay vì `[]` như List).

# Tạo Tuple cơ bản
my_tuple = (1, "a", True, 1) # Cho phép trùng lặp (số 1)
print(my_tuple)

# Truy xuất bằng Index (Giống hệt List)
print(my_tuple[0]) # Kết quả: 1
print(my_tuple[-1]) # Kết quả: 1

# Cắt lát (Slicing) (Giống hệt List)
print(my_tuple[1:3]) # Kết quả: ('a', True)

🔥 Lưu ý đặc biệt: Tuple có 1 phần tử

Nếu muốn tạo Tuple chỉ có một phần tử, bạn **bắt buộc** phải thêm dấu phẩy (,) ở cuối.

# SAI CÁCH (Python nghĩ đây là phép toán trong ngoặc)
not_a_tuple = ("hello")
print(type(not_a_tuple)) # Kết quả:

# ĐÚNG CÁCH (Có dấu phẩy)
a_tuple = ("hello",)
print(type(a_tuple)) # Kết quả:

3. Tính "Bất Biến" (Immutable)

Đây là đặc điểm cốt lõi của Tuple. Chúng ta không thể thay đổi, thêm, hoặc xóa phần tử sau khi Tuple đã được tạo.

my_tuple = (10, 20, 30)

# Thử cập nhật giá trị (Sẽ gây lỗi)
# my_tuple[0] = 5 # Báo lỗi: TypeError: 'tuple' object does not support item assignment

# Thử thêm phần tử (Sẽ gây lỗi)
# my_tuple.append(40) # Báo lỗi: AttributeError: 'tuple' object has no attribute 'append'

# Thử xóa phần tử (Sẽ gây lỗi)
# del my_tuple[0] # Báo lỗi: TypeError: 'tuple' object doesn't support item deletion

Dictionary (Từ điển) - một cấu trúc dữ liệu cực kỳ mạnh mẽ. Thay vì dùng index (0, 1, 2...), Dictionary cho phép chúng ta dùng "nhãn" (Key) để truy cập dữ liệu!

1. Khái niệm Dictionary (Từ điển)

Đặt vấn đề: List dùng số (0, 1, 2...) để tìm đồ vật. Nếu ta muốn dùng "tên" (nhãn) để tìm thì sao? Ví dụ: tìm "điểm toán" thay vì tìm "phần tử ở index 0".

Dictionary: Lưu trữ dữ liệu theo các cặp **Key : Value** (Chìa khóa : Giá trị).

  • Key: Giống như cái "nhãn" hay "địa chỉ" (index) mà chúng ta tự đặt. Key phải là **duy nhất** và **không thể thay đổi** (thường là Chuỗi hoặc Số).
  • Value: Là giá trị (dữ liệu) ứng với cái Key đó. Value có thể là bất cứ thứ gì (Số, Chuỗi, List, thậm chí là một Dictionary khác).

2. Tạo Dictionary

Chúng ta dùng dấu ngoặc nhọn `{}` để tạo Dictionary.

# 1. Tạo Dictionary rỗng
my_dict = {}

# 2. Tạo Dictionary có giá trị
hoc_sinh = {
"ten": "Bình",
"lop": "8A",
"diem_tb": 8.5,
"mon_hoc": ["Toán", "Văn", "Anh"]
}
print(hoc_sinh)

3. Truy xuất, Thêm và Cập nhật

Chúng ta dùng cú pháp `dict[Key]` để thực hiện tất cả các thao tác này.

# Giả sử chúng ta có dict hoc_sinh từ trên
hoc_sinh = {"ten": "Bình", "lop": "8A", "diem_tb": 8.5}

# 1. Truy xuất Value bằng Key
print(hoc_sinh["ten"]) # Kết quả: "Bình"

# 2. Thêm mới (Gán một Key chưa tồn tại)
hoc_sinh["dia_chi"] = "Hà Nội"
print(hoc_sinh) # Dict đã có thêm key "dia_chi"

# 3. Cập nhật (Gán lại Key đã tồn tại)
hoc_sinh["diem_tb"] = 9.0
print(hoc_sinh) # Key "diem_tb" đã được cập nhật

4. Xóa khỏi Dictionary

Có 2 cách phổ biến để xóa một cặp Key-Value:

hoc_sinh = {"ten": "Bình", "lop": "8A", "diem_tb": 9.0}

# 1. Dùng lệnh 'del' (Xóa theo Key, không trả về gì)
del hoc_sinh["lop"]
print(hoc_sinh) # Kết quả: {'ten': 'Bình', 'diem_tb': 9.0}

# 2. Dùng phương thức .pop() (Xóa theo Key và trả về Value)
diem = hoc_sinh.pop("diem_tb")
print(f"Điểm đã xóa: {diem}") # Kết quả: 9.0
print(hoc_sinh) # Kết quả: {'ten': 'Bình'}

Làm các bài tập nhỏ cho Tuple và Dictionary, sau đó là một bài tổng hợp về Siêu Anh Hùng!

Bài tập 1: Thực hành về Tuple

Cho thông tin: Tên: "An", Ngày sinh: "20/10/2005".

  1. Tạo một Tuple tên `thong_tin` chứa 2 giá trị trên.
  2. In ra ngày sinh của "An" (dùng index).
  3. Thử cập nhật Tên (Index 0) thành "Bình" và quan sát lỗi. (Hãy ghi chú lệnh này lại thay vì chạy thật để tránh dừng chương trình).

Bài tập 2: Thực hành về Dictionary

Tạo một Dictionary `meo` để quản lý thông tin một chú mèo.

  1. Tạo `meo` với các cặp Key-Value: "ten": "Tom", "tuoi": 3, "mau_long": "Xám".
  2. In ra tuổi của chú mèo.
  3. Thêm một cặp Key-Value mới: "thuc_an_ua_thich": "Cá".
  4. Cập nhật "tuoi" thành 4.

Bài tập 3: Tổng Hợp (Siêu Anh Hùng)

Tạo một Dictionary để quản lý thông tin của một "siêu anh hùng".

  1. Tạo Dictionary `sieu_anh_hung` với: "ten": "Iron Man", "suc_manh": "Bộ giáp", "diem_yeu": "Lò phản ứng".
  2. In ra sức mạnh của siêu anh hùng.
  3. Thêm một Key mới là "phe_phai" với giá trị "Anh hùng".
  4. Cập nhật "diem_yeu" thành "Không có (trên lý thuyết)".
  5. Xóa "diem_yeu" khỏi Dictionary (vì anh ấy đã cập nhật).