Tuple methods thường dùng trong Python

Python Tutorial | by Hoc Python

Bạn đã biết rằng Tuple là một cấu trúc dữ liệu đặc biệt: nó có thứ tự nhưng lại bất biến (immutable), nghĩa là một khi đã tạo ra, bạn không thể thay đổi nội dung bên trong nó. Chính vì đặc tính này mà Tuple có số lượng "method" (các hàm tích hợp sẵn dành riêng cho đối tượng) ít hơn đáng kể so với List.

Vậy, Tuple có những phương thức nào và chúng được dùng để làm gì? Bài viết này sẽ giới thiệu cho bạn hai method chính mà bạn sẽ thường xuyên gặp khi làm việc với Tuple, cùng với một số hàm tích hợp sẵn quan trọng khác của Python mà cũng rất hữu ích khi áp dụng cho Tuple. Hãy cùng tìm hiểu những công cụ mà Python cung cấp để tương tác với Tuple nhé!

Method là gì?

Trong lập trình hướng đối tượng (Object-Oriented Programming - OOP) như Python, mọi thứ bạn tương tác đều là một đối tượng (object). Một đối tượng không chỉ chứa dữ liệu mà nó còn có các phương thức (methods).

Bạn có thể hiểu method đơn giản là những hàm (functions) được "gắn liền" với một đối tượng cụ thể, và chúng có thể thực hiện các hành động hoặc thao tác trên dữ liệu của chính đối tượng đó. Để gọi một method, bạn sử dụng cú pháp dấu chấm (.) sau tên đối tượng, ví dụ: ten_doi_tuong.ten_method().

Ví dụ với chuỗi (string) - một đối tượng phổ biến:

my_string = "hello python"

# 'upper()' là một method của đối tượng chuỗi
upper_string = my_string.upper()
print(f"Chuỗi gốc: {my_string}")   # Output: Chuỗi gốc: hello python
print(f"Chuỗi viết hoa: {upper_string}") # Output: Chuỗi viết hoa: HELLO PYTHON

# 'count()' cũng là một method của đối tượng chuỗi
count_o = my_string.count('o')
print(f"Số lần xuất hiện của 'o': {count_o}") # Output: Số lần xuất hiện của 'o': 2

Tại sao Tuple có ít methods?

Đây là một câu hỏi rất hay và câu trả lời nằm ở đặc tính cốt lõi của Tuple: tính bất biến (immutability).

Tính bất biến của Tuple: Như bạn đã biết, một khi Tuple được tạo, nội dung của nó không thể bị thay đổi (thêm, xóa, hoặc sửa đổi phần tử). Tuple được thiết kế để lưu trữ các tập hợp dữ liệu cố định mà bạn muốn đảm bảo không bị thay đổi trong suốt quá trình chạy chương trình.

Hệ quả đối với methods: Vì lý do đó, Tuple không cần và không có các method cho phép thay đổi trạng thái của nó. Điều này khác biệt rõ rệt so với List (một kiểu dữ liệu có thể thay đổi - mutable), mà có rất nhiều method để thêm (append(), extend(), insert()), xóa (remove(), pop(), clear()), và sắp xếp (sort()) các phần tử.

Nếu bạn cố gắng tìm các method như append() hay remove() trên một Tuple, Python sẽ báo lỗi AttributeError.

Ví dụ:

my_tuple = (10, 20, 30)

try:
    my_tuple.append(40) # Cố gắng thêm phần tử
except AttributeError as e:
    print(f"Lỗi: {e}")
    # Output: Lỗi: 'tuple' object has no attribute 'append'

try:
    my_tuple[0] = 5 # Cố gắng sửa đổi phần tử (không phải method, nhưng minh họa tính bất biến)
except TypeError as e:
    print(f"Lỗi: {e}")
    # Output: Lỗi: 'tuple' object does not support item assignment

Mục tiêu bài này:

Mặc dù có ít method, Tuple vẫn cung cấp một số công cụ hữu ích để tương tác với dữ liệu của nó mà không làm thay đổi Tuple gốc. Trong bài viết này, chúng ta sẽ tập trung vào việc giới thiệu hai method chính mà bạn sẽ thường gặp khi làm việc với Tuple:

  1. count(): Để đếm số lần xuất hiện của một phần tử.

  2. index(): Để tìm vị trí của một phần tử.

Ngoài ra, chúng ta cũng sẽ điểm qua một số hàm tích hợp sẵn của Python thường được sử dụng cùng với Tuple để thực hiện các thao tác như lấy độ dài, tìm giá trị lớn nhất/nhỏ nhất, hoặc tính tổng.

Các Tuple Methods thường dùng trong Python

Mặc dù Tuple là bất biến và có số lượng phương thức (methods) hạn chế, có hai method bạn sẽ gặp rất thường xuyên khi làm việc với chúng: count()index(). Cả hai method này đều giúp bạn tìm kiếm thông tin trong Tuple mà không làm thay đổi nội dung của nó.

count() Method

  • Khái niệm: Phương thức count() dùng để đếm số lần xuất hiện của một giá trị cụ thể trong Tuple. Nó duyệt qua toàn bộ Tuple và trả về tổng số lần giá trị bạn chỉ định xuất hiện.

Cú pháp:

ten_tuple.count(gia_tri)

Tham số:

  • gia_tri: Đây là giá trị mà bạn muốn đếm số lần xuất hiện trong Tuple.

Trả về: Một số nguyên biểu thị tổng số lần gia_tri xuất hiện trong Tuple.

Ví dụ minh họa:

  • Đếm số lần một số xuất hiện:

my_numbers = (1, 2, 2, 3, 4, 2, 5)
print(f"Tuple số: {my_numbers}")

# Đếm số lần số 2 xuất hiện
count_of_2 = my_numbers.count(2)
print(f"Số lần số 2 xuất hiện: {count_of_2}") # Output: Số lần số 2 xuất hiện: 3

# Đếm số lần số 1 xuất hiện
count_of_1 = my_numbers.count(1)
print(f"Số lần số 1 xuất hiện: {count_of_1}") # Output: Số lần số 1 xuất hiện: 1

Đếm số lần một chuỗi xuất hiện:

my_fruits = ("apple", "banana", "apple", "cherry", "apple")
print(f"Tuple trái cây: {my_fruits}")

# Đếm số lần "apple" xuất hiện
count_apples = my_fruits.count("apple")
print(f"Số lần 'apple' xuất hiện: {count_apples}") # Output: Số lần 'apple' xuất hiện: 3

# Đếm số lần "banana" xuất hiện
count_bananas = my_fruits.count("banana")
print(f"Số lần 'banana' xuất hiện: {count_bananas}") # Output: Số lần 'banana' xuất hiện: 1

Trường hợp giá trị không tồn tại (trả về 0): Nếu giá trị bạn tìm kiếm không có trong Tuple, count() sẽ trả về 0.

my_colors = ("red", "green", "blue")
print(f"Tuple màu sắc: {my_colors}")

# Đếm số lần "yellow" xuất hiện (không có trong Tuple)
count_yellow = my_colors.count("yellow")
print(f"Số lần 'yellow' xuất hiện: {count_yellow}") # Output: Số lần 'yellow' xuất hiện: 0

index() Method

Khái niệm: Phương thức index() dùng để tìm vị trí (chỉ số - index) đầu tiên của một giá trị cụ thể trong Tuple. Nó trả về chỉ số của phần tử khớp đầu tiên mà nó tìm thấy.

Cú pháp:

ten_tuple.index(gia_tri, start, end)

Tham số:

  • gia_tri: Giá trị mà bạn muốn tìm chỉ số của nó.

  • start (tùy chọn): Chỉ số mà bạn muốn bắt đầu tìm kiếm. Mặc định là 0 (bắt đầu từ đầu Tuple).

  • end (tùy chọn): Chỉ số mà bạn muốn kết thúc tìm kiếm (không bao gồm phần tử tại chỉ số này). Mặc định là hết Tuple.

Trả về: Một số nguyên, là chỉ số của lần xuất hiện đầu tiên của gia_tri trong phạm vi tìm kiếm.

Trường hợp lỗi: Nếu gia_tri không được tìm thấy trong Tuple (hoặc không được tìm thấy trong phạm vi startend đã chỉ định), phương thức index() sẽ gây ra lỗi ValueError.

Ví dụ minh họa:

  • Tìm chỉ số của một giá trị:

my_letters = ('a', 'b', 'c', 'd', 'a', 'e')
print(f"Tuple chữ cái: {my_letters}")

# Tìm chỉ số của 'c'
index_c = my_letters.index('c')
print(f"Chỉ số của 'c': {index_c}") # Output: Chỉ số của 'c': 2

# Tìm chỉ số của lần xuất hiện đầu tiên của 'a'
index_first_a = my_letters.index('a')
print(f"Chỉ số của 'a' (lần đầu tiên): {index_first_a}") # Output: Chỉ số của 'a' (lần đầu tiên): 0

Tìm chỉ số với phạm vi tìm kiếm (start, end): Bạn có thể chỉ định một phạm vi để tìm kiếm, giúp bạn tìm kiếm các lần xuất hiện khác của một giá trị.

my_data = (10, 20, 30, 20, 40, 50)
print(f"Tuple dữ liệu: {my_data}")

# Tìm chỉ số của 20, bắt đầu từ chỉ số 0 (mặc định)
index_20_first = my_data.index(20)
print(f"Chỉ số của 20 (lần đầu): {index_20_first}") # Output: Chỉ số của 20 (lần đầu): 1

# Tìm chỉ số của 20, bắt đầu tìm kiếm từ chỉ số 2
index_20_second = my_data.index(20, 2)
print(f"Chỉ số của 20 (bắt đầu từ index 2): {index_20_second}") # Output: Chỉ số của 20 (bắt đầu từ index 2): 3

# Tìm chỉ số của 20, trong phạm vi từ chỉ số 0 đến 2 (không bao gồm 2)
# Sẽ tìm thấy 20 ở chỉ số 1
index_20_in_range = my_data.index(20, 0, 3)
print(f"Chỉ số của 20 (trong khoảng [0, 3)): {index_20_in_range}") # Output: Chỉ số của 20 (trong khoảng [0, 3)): 1

Xử lý lỗi ValueError khi không tìm thấy: Vì index() sẽ gây lỗi nếu không tìm thấy giá trị, bạn thường nên sử dụng khối try-except để xử lý tình huống này một cách duyên dáng. Hoặc, bạn có thể kết hợp với in toán tử (kiểm tra sự tồn tại) hoặc count() để tránh lỗi.

my_items = ("item_A", "item_B", "item_C")
print(f"Tuple vật phẩm: {my_items}")

# Cách 1: Sử dụng try-except
try:
    index_item_D = my_items.index("item_D")
    print(f"Chỉ số của 'item_D': {index_item_D}")
except ValueError:
    print("Không tìm thấy 'item_D' trong Tuple.")
    # Output: Không tìm thấy 'item_D' trong Tuple.

# Cách 2: Kiểm tra sự tồn tại trước với 'in' (thường được ưu tiên)
if "item_E" in my_items:
    index_item_E = my_items.index("item_E")
    print(f"Chỉ số của 'item_E': {index_item_E}")
else:
    print("Không tìm thấy 'item_E' trong Tuple.")
    # Output: Không tìm thấy 'item_E' trong Tuple.

Hai method count()index() này là những công cụ cơ bản nhưng hiệu quả để bạn truy vấn thông tin trong Tuple mà không làm ảnh hưởng đến tính bất biến của chúng.

Các hàm tích hợp sẵn (Built-in Functions) thường dùng với Tuple trong Python

Ngoài các method riêng của Tuple như count()index(), Python còn cung cấp nhiều hàm tích hợp sẵn (built-in functions) có thể được áp dụng cho các Tuple. Điều quan trọng cần lưu ý là các hàm này không phải là method của Tuple (tức là bạn không gọi chúng bằng cú pháp ten_tuple.function()). Thay vào đó, chúng là các hàm độc lập mà bạn truyền Tuple vào làm đối số. Chúng cũng không làm thay đổi Tuple gốc do tính bất biến của nó.

Dưới đây là một số hàm built-in phổ biến và hữu ích khi làm việc với Tuple:

len()

Khái niệm: Hàm len() (viết tắt của "length") trả về số lượng phần tử có trong một Tuple.

Cú pháp: len(ten_tuple)

Ví dụ minh họa:

my_tuple = ("apple", "banana", "cherry", "date")
print(f"Tuple: {my_tuple}")

# Lấy độ dài của Tuple
tuple_length = len(my_tuple)
print(f"Số lượng phần tử trong Tuple: {tuple_length}") # Output: Số lượng phần tử trong Tuple: 4

empty_tuple = ()
print(f"Độ dài của Tuple rỗng: {len(empty_tuple)}") # Output: Độ dài của Tuple rỗng: 0

max()

  • Khái niệm: Hàm max() trả về phần tử có giá trị lớn nhất trong Tuple.

  • Lưu ý quan trọng: Hàm này chỉ hoạt động nếu tất cả các phần tử trong Tuple có thể so sánh được với nhau (ví dụ: tất cả là số, hoặc tất cả là chuỗi). Bạn không thể tìm max() của một Tuple chứa hỗn hợp số và chuỗi vì Python không biết cách so sánh chúng.

  • Cú pháp: max(ten_tuple)

Ví dụ minh họa:

scores = (85, 92, 78, 95, 88)
print(f"Tuple điểm số: {scores}")

# Tìm điểm số cao nhất
highest_score = max(scores)
print(f"Điểm số cao nhất: {highest_score}") # Output: Điểm số cao nhất: 95

names = ("Alice", "Bob", "Charlie")
print(f"Tuple tên: {names}")
# Với chuỗi, max() sẽ trả về chuỗi lớn nhất theo thứ tự từ điển
longest_name = max(names)
print(f"Tên lớn nhất (theo thứ tự từ điển): {longest_name}") # Output: Tên lớn nhất (theo thứ tự từ điển): Charlie

# Trường hợp lỗi: Tuple chứa các kiểu dữ liệu không thể so sánh
mixed_data = (10, "hello", 5)
try:
    max_mixed = max(mixed_data)
    print(max_mixed)
except TypeError as e:
    print(f"Lỗi khi tìm max() cho Tuple chứa kiểu dữ liệu hỗn hợp: {e}")
    # Output: Lỗi khi tìm max() cho Tuple chứa kiểu dữ liệu hỗn hợp: '>' not supported between instances of 'str' and 'int'

min()

  • Khái niệm: Hàm min() trả về phần tử có giá trị nhỏ nhất trong Tuple.

  • Lưu ý quan trọng: Tương tự như max(), tất cả các phần tử trong Tuple phải có thể so sánh được với nhau.

  • Cú pháp: min(ten_tuple)

Ví dụ minh họa:

temperatures = (25.5, 23.0, 28.1, 22.9, 27.0)
print(f"Tuple nhiệt độ: {temperatures}")

# Tìm nhiệt độ thấp nhất
lowest_temp = min(temperatures)
print(f"Nhiệt độ thấp nhất: {lowest_temp}") # Output: Nhiệt độ thấp nhất: 22.9

words = ("zebra", "apple", "cat")
print(f"Tuple từ: {words}")
# Với chuỗi, min() sẽ trả về chuỗi nhỏ nhất theo thứ tự từ điển
smallest_word = min(words)
print(f"Từ nhỏ nhất (theo thứ tự từ điển): {smallest_word}") # Output: Từ nhỏ nhất (theo thứ tự từ điển): apple

sum()

  • Khái niệm: Hàm sum() trả về tổng của tất cả các phần tử trong Tuple.

  • Lưu ý quan trọng: Hàm này chỉ hoạt động với Tuple chứa các giá trị số (integers, floats, v.v.). Nếu Tuple chứa các kiểu dữ liệu khác như chuỗi, nó sẽ báo lỗi.

  • Cú pháp: sum(ten_tuple)

Ví dụ minh họa:

sales_figures = (100, 250, 150, 300)
print(f"Tuple doanh số: {sales_figures}")

# Tính tổng doanh số
total_sales = sum(sales_figures)
print(f"Tổng doanh số: {total_sales}") # Output: Tổng doanh số: 800

# Ví dụ lỗi: Tuple chứa chuỗi
items_count = ("apple", 5, "banana")
try:
    total_items = sum(items_count)
    print(total_items)
except TypeError as e:
    print(f"Lỗi khi tính tổng Tuple chứa kiểu dữ liệu không phải số: {e}")
    # Output: Lỗi khi tính tổng Tuple chứa kiểu dữ liệu không phải số: unsupported operand type(s) for +: 'int' and 'str'

sorted()

  • Khái niệm: Hàm sorted() tạo và trả về một List mới chứa tất cả các phần tử của Tuple đã được sắp xếp theo thứ tự tăng dần (mặc định). Tuple gốc không bị thay đổi.

  • Lưu ý quan trọng: Tương tự như max()min(), các phần tử trong Tuple phải có thể so sánh được với nhau.

Cú pháp: sorted(ten_tuple, reverse=False)

  • reverse (tùy chọn): Nếu đặt là True, List sẽ được sắp xếp theo thứ tự giảm dần. Mặc định là False.

Ví dụ minh họa:

unsorted_numbers = (3, 1, 4, 1, 5, 9, 2)
print(f"Tuple chưa sắp xếp: {unsorted_numbers}")

# Sắp xếp Tuple và nhận về một List mới
sorted_list_asc = sorted(unsorted_numbers)
print(f"List đã sắp xếp tăng dần: {sorted_list_asc}") # Output: List đã sắp xếp tăng dần: [1, 1, 2, 3, 4, 5, 9]

# Sắp xếp giảm dần
sorted_list_desc = sorted(unsorted_numbers, reverse=True)
print(f"List đã sắp xếp giảm dần: {sorted_list_desc}") # Output: List đã sắp xếp giảm dần: [9, 5, 4, 3, 2, 1, 1]

# Tuple gốc vẫn không thay đổi
print(f"Tuple gốc sau khi sắp xếp: {unsorted_numbers}") # Output: Tuple gốc sau khi sắp xếp: (3, 1, 4, 1, 5, 9, 2)

Các hàm tích hợp sẵn này cung cấp những công cụ mạnh mẽ để phân tích và thao tác với dữ liệu trong Tuple mà vẫn duy trì được tính bất biến của chúng.

Kết bài

Tuple là bất biến (immutable). Điều này có nghĩa là chúng không có các method để thay đổi nội dung như thêm, xóa hay sửa đổi phần tử.

Bạn đã học được hai phương thức chính của Tuple:

  • count(): Dùng để đếm số lần xuất hiện của một giá trị trong Tuple.

  • index(): Dùng để tìm vị trí (chỉ số) đầu tiên của một giá trị trong Tuple.

Ngoài ra, bạn cũng đã làm quen với các hàm tích hợp sẵn của Python rất hữu ích khi làm việc với Tuple:

  • len(): Để lấy độ dài (số lượng phần tử) của Tuple.

  • max(): Để tìm phần tử lớn nhất.

  • min(): Để tìm phần tử nhỏ nhất.

  • sum(): Để tính tổng các phần tử (chỉ dùng với Tuple số).

  • sorted(): Để tạo một List mới đã sắp xếp các phần tử của Tuple (Tuple gốc không đổi).

Lời khuyên quan trọng:

Hãy luôn nhớ rằng Tuple được thiết kế để lưu trữ các tập hợp dữ liệu cố định, không thay đổi. Nếu bạn thường xuyên cần thực hiện các thao tác thêm, xóa, hoặc sửa đổi dữ liệu, thì List sẽ là lựa chọn phù hợp và hiệu quả hơn nhiều. Tuy nhiên, khi bạn cần đảm bảo tính toàn vẹn của dữ liệu và không muốn chúng bị thay đổi ngẫu nhiên, Tuple là một lựa chọn tuyệt vời.

Bằng cách nắm vững các phương thức và hàm này, bạn có thể tương tác hiệu quả với Tuple, trích xuất thông tin cần thiết và tận dụng tối đa đặc tính của chúng trong các chương trình Python của mình.

Bài viết liên quan