Ở bài học trước, bạn đã làm quen với Danh sách (List) – nơi bạn có thể thoải mái thêm, xóa hoặc thay đổi các phần tử. Tuy nhiên, trong lập trình, đôi khi chúng ta cần một "danh sách" mà một khi đã tạo ra thì không được phép thay đổi nội dung bên trong để đảm bảo tính an toàn cho dữ liệu. Đó chính là lúc chúng ta cần tới Tuple.
Bạn có thể tưởng tượng:
- List giống như một bảng thông báo dùng phấn, bạn có thể xóa đi viết lại tùy ý
- Tuple giống như một tấm bảng bằng đá đã được khắc chữ, bạn chỉ có thể đọc chứ không thể sửa nội dung trên đó
20.1 Tuples là gì?
Tuple là một tập hợp các phần tử có thứ tự và không thể thay đổi. Trong Python, Tuple được đặt trong cặp dấu ngoặc đơn ().
Tuple có nghĩa là “bộ” dữ liệu cố định.
Ví dụ:
# Tạo một Tuple chứa các ngày trong tuần (vì các ngày này không bao giờ thay đổi)
cac_ngay = ("Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật")
print(cac_ngay)
Lưu ý: Nếu Tuple chỉ có một phần tử, bạn phải thêm dấu phẩy “,” sau phần tử đó, nếu không Python sẽ hiểu lầm đó là một kiểu dữ liệu khác (như chuỗi hoặc số).
- mon_hoc = ("Toán",) : Đây là Tuple
- mon_hoc = ("Toán") : Đây là String (Chuỗi)
20.2 Truy cập Tuples
Cách truy cập các phần tử trong Tuple hoàn toàn giống với List. Chúng ta sử dụng chỉ số (index) bắt đầu từ 0.
- Truy cập theo chỉ số dương: ten_tuple[0] lấy phần tử đầu tiên
- Truy cập theo chỉ số âm: ten_tuple[-1] lấy phần tử cuối cùng
- Truy cập một khoảng: ten_tuple[1:3] lấy các phần tử từ vị trí 1 đến sát vị trí 3
20.3 Cập nhật Tuples
Vì Tuple là "bảng đá" không thể sửa, nên bạn không thể trực tiếp thay đổi, thêm hoặc xóa phần tử sau khi đã tạo.
Tuy nhiên, có một "mẹo" nhỏ cho lập trình viên:
[1] Chuyển Tuple thành List
[2] Sửa đổi trên List đó
[3] Chuyển ngược List về lại Tuple
Ví dụ:
toa_do = (10, 20)
temp_list = list(toa_do) # Chuyển thành List
temp_list[0] = 15 # Sửa giá trị
toa_do = tuple(temp_list) # Chuyển về Tuple
print(toa_do) # Kết quả: (15, 20)
20.4 Phân rã Tuples
Khi chúng ta tạo một Tuple, đó gọi là "đóng gói" (packing). Python cho phép chúng ta làm ngược lại, gọi là "phân rã" (unpacking) để lấy các giá trị ra và gán vào các biến riêng lẻ.
Ví dụ:
hoc_sinh = ("An", 14, "Lớp 8A")
(ten, tuoi, lop) = hoc_sinh # Phân rã
print(ten) # Kết quả: An
print(tuoi) # Kết quả: 14
20.5 Duyệt qua Tuples
Bạn có thể dùng vòng lặp for để duyệt qua từng phần tử trong Tuple giống với List.
trai_cay = ("táo", "xoài", "lê")
for x in trai_cay:
print("Tôi có quả:", x)
20.6 Nối Tuples
Để nối hai hay nhiều Tuple lại với nhau, bạn sử dụng toán tử cộng +.
tuple1 = ("a", "b")
tuple2 = (1, 2)
tuple3 = tuple1 + tuple2
print(tuple3) # Kết quả: ('a', 'b', 1, 2)
20.7 Các phương thức của Tuple
Vì không thể thay đổi nội dung, Tuple chỉ có 2 phương thức chính:
- count(): Đếm số lần một giá trị xuất hiện trong Tuple
- index(): Tìm vị trí (chỉ số) đầu tiên của một giá trị trong Tuple
20.8 Bài tập và câu hỏi
Bài tập
Bài 20a: Quản lý thông tin cơ bản của Sản phẩm
Ngữ cảnh: Trong hệ thống bán hàng, mỗi đặc tính của sản phẩm (như màu sắc, kích thước) thường được cố định thông tin để tránh sai lệch trong quá trình tính toán giỏ hàng.
Yêu cầu:
1. Tạo một Tuple có tên san_pham chứa 3 thông tin: Tên sản phẩm, Giá tiền, và Màu sắc. (Ví dụ: "iPhone 15", 22000000, "Titan tự nhiên").
2. Sử dụng kỹ thuật Phân rã (Unpacking) để gán 3 giá trị trên vào các biến: ten, gia, mau.
3. In ra màn hình thông báo theo định dạng: "Sản phẩm [ten] màu [mau] đang có giá là [gia] VNĐ."
Bài 20b: Cập nhật Trạng thái đơn hàng
Ngữ cảnh: Trạng thái đơn hàng thường được lưu dưới dạng Tuple để đảm bảo tính toàn vẹn. Tuy nhiên, khi vận chuyển, nhân viên cần cập nhật trạng thái mới cho đơn hàng đó.
Yêu cầu:
1. Cho một Tuple ban đầu: trang_thai_don_hang = ("Chờ xác nhận", "Đang đóng gói", "Đang giao hàng")
2. Giả sử đơn hàng đã được giao thành công. Bạn hãy thực hiện các bước (theo mẹo chuyển đổi sang List) để thêm trạng thái "Đã giao hàng" vào cuối Tuple trên
3. In ra vị trí (index) của trạng thái "Đang đóng gói" trong Tuple mới bằng phương thức index()
4. Đếm xem trong Tuple mới có bao nhiêu trạng thái bằng hàm len().
Bài 20c: Phân tích lịch sử giao dịch
Ngữ cảnh: Một hệ thống lưu trữ danh sách các giao dịch dưới dạng một danh sách các Tuple. Mỗi Tuple đại diện cho một giao dịch gồm: (Mã đơn hàng, Số tiền, Trạng thái thanh toán).
Yêu cầu:
1. Cho danh sách giao dịch sau: danh_sach_gd = [("DH001", 500000, "Thành công"), ("DH002", 1200000, "Thất bại"), ("DH003", 300000, "Thành công"), ("DH004", 850000, "Thành công")]
2.Viết chương trình duyệt qua danh sách này bằng vòng lặp for
3. Tính tổng số tiền của tất cả các đơn hàng có trạng thái "Thành công"
4. In ra mã đơn hàng (ID) của tất cả các đơn hàng bị "Thất bại"
Gợi ý: Khi duyệt qua danh_sach_gd, mỗi phần tử x sẽ là một Tuple. Bạn có thể dùng x[1] để lấy số tiền và x[2] để kiểm tra trạng thái.
Câu hỏi
Câu hỏi 20.1: Đặc điểm nào sau đây là của Tuple?
A. Có thể thay đổi giá trị phần tử sau khi tạo
B. Sử dụng dấu ngoặc vuông []
C. Không thể thay đổi giá trị
D. Không có thứ tự
Câu hỏi 20.2: Để nối hai Tuple t1 và t2, ta dùng lệnh nào?
A. t1.append(t2)
B. t1 + t2
C. t1.join(t2)
D. t1.add(t2)
Here is the English translation of your lesson, using standard programming terminology suitable for a technical curriculum.
20. The Tuple Data Type
In the previous lesson, you became familiar with Lists – where you can freely add, remove, or modify elements. However, in programming, we sometimes need a "list" that, once created, cannot be changed. This ensures data integrity and safety. This is where we use Tuples.
Think of it this way:
- List is like a chalkboard; you can erase and rewrite content as much as you like
- Tuple is like a stone tablet; once carved, you can only read it, not modify it
20.1 What is a Tuple?
A Tuple is a collection of elements that is ordered and immutable (unchangeable). In Python, Tuples are defined using parentheses ().
Example:
Python
# Create a Tuple containing days of the week (since these never change)
days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
print(days)
Note: If a Tuple contains only one element, you must include a trailing comma ,. Otherwise, Python will treat it as another data type (like a String or Integer).
- subject = ("Math",) : This is a Tuple
- subject = ("Math") : This is a String
20.2 Accessing Tuples
Accessing elements in a Tuple is identical to Lists. We use an index starting from 0
- Positive Index: my_tuple[0] gets the first element
- Negative Index: my_tuple[-1] gets the last element
- Slicing: my_tuple[1:3] gets elements from index 1 up to (but not including) index 3
20.3 Updating Tuples
Since Tuples are "stone tablets," you cannot directly change, add, or remove elements after creation. However, developers often use this "workaround":
1. Cast the Tuple into a List.
2. Modify the List.
3. Cast the List back into a Tuple.
Example:
Python
coordinates = (10, 20)
temp_list = list(coordinates) # Convert to List
temp_list[0] = 15 # Modify value
coordinates = tuple(temp_list) # Convert back to Tuple
print(coordinates) # Output: (15, 20)
20.4 Unpacking Tuples
Creating a Tuple is called packing. Python also allows unpacking, where we extract values back into individual variables.
Example:
Python
student = ("An", 14, "Class 8A")
(name, age, grade) = student # Unpacking
print(name) # Output: An
print(age) # Output: 14
20.5 Looping through Tuples
You can use a for loop to iterate through Tuple elements just like a List.
Python
fruits = ("apple", "mango", "pear")
for x in fruits:
print("I have a:", x)
20.6 Joining Tuples
To concatenate two or more Tuples, use the + operator.
Python
tuple1 = ("a", "b")
tuple2 = (1, 2)
tuple3 = tuple1 + tuple2
print(tuple3) # Output: ('a', 'b', 1, 2)
20.7 Tuple Methods
Because they are immutable, Tuples only have two primary methods:
- count(): Returns the number of times a value occurs
- index(): Finds the first index of a specified value
20.8 Exercises & Quiz
Exercises
Exercise 20a: Basic Product Management Context: In E-commerce systems, product attributes (like color or size) are often fixed to avoid errors during checkout calculations.
Task:
1. Create a Tuple named product containing: Product Name, Price, and Color. (e.g., "iPhone 15", 22000000, "Natural Titanium")
2. Use Unpacking to assign these values to variables: name, price, and color
3. Print a message: "Product [name] in [color] is priced at [price] VND."
Exercise 20b: Updating Order Status Context: Order statuses are stored in Tuples to ensure integrity, but staff must update them as the package moves.
Task:
1. Start with this Tuple: order_status = ("Pending", "Packaging", "Shipping")
2. Assuming the order is delivered, use the "List conversion" trick to add "Delivered" to the end of the Tuple
3. Print the index of the "Packaging" status using the index() method
4. Count the total number of statuses using the len() function
Exercise 20c: Transaction History Analysis Context: A system stores transactions as a list of Tuples: (Order ID, Amount, Payment Status).
Task:
1. Given: transactions = [("ID001", 500000, "Success"), ("ID002", 1200000, "Failed"), ("ID003", 300000, "Success"), ("ID004", 850000, "Success")]
2. Write a program to iterate through this list using a for loop
3. Calculate the Total Revenue (Sum of amounts where status is "Success")
4. Print the Order ID of all "Failed" transactions
Quiz
Question 20.1: Which characteristic describes a Tuple?
A. Elements can be changed after creation
B. Uses square brackets []
C. Immutable (cannot be changed)
D. Unordered
Question 20.2: How do you join two Tuples, t1 and t2?
A. t1.append(t2)
B. t1 + t2
C. t1.join(t2)
D. t1.add(t2)
Nghe đồn, chơi hoa để cảm nhận: "hoa tươi đó, rồi héo đó, đẹp đó, rồi tàn đó...nhắc nhở về sự hữu hạn, sự mong manh của mọi thứ, vậy hãy trân trọng, thưởng thức mọi thứ đã và đang có". Chả biết có đúng không?