Python cơ bản
Python hướng đối tượng
Python nâng cao
Quảng cáo

Kiểu dữ liệu tuple

Bài học này chúng ta sẽ đi nghiên cứu chi tiết về kiểu dữ liệu tupe trong lập trình Python thông qua các ví dụ, xem nó có khác gì so với kiểu danh sách (list).

Giống như với Kiểu danh sách (list) thì tuple là một kiểu dữ liệu tập hợp khác trong Python và cũng được sử dụng rất rộng rãi. Mặc dù tuple có điểm tương tự như list, giữa hai kiểu dữ liệu có nhiều điểm khác biệt về bản chất và mục đích sử dụng. Bài học này sẽ hướng dẫn chi tiết về cấu trúc dữ liệu tuple cũng như phân biệt khi nào sử dụng tuple, khi nào sử dụng list.

Ví dụ về kiểu dữ liệu tupe trong Python

Ví dụ

>>> vn = ('Vietnam', 330_000, 95_000_000, 2500)
>>> us = ('USA', 9_600_000, 350_000_000, 40_000)

>>> us_info = f'''Official name: {us[0]}
... Area: {us[1]} km2
... Population: {us[2]}
... GDP/capital: {us[3]} USD'''

>>> print(us_info)
Official name: USA
Area: 9600000 km2
Population: 350000000
GDP/capital: 40000 USD

>>> vn_info = f'''Official name: {vn[0]}
... Area: {vn[1]} km2
... Population: {vn[2]}
... GDP/capital: {vn[3]} USD'''

>>> print(vn_info)
Official name: Vietnam
Area: 330000 km2
Population: 95000000
GDP/capital: 2500 USD

Trong ví dụ trên chúng ta đã tạo ra 2 biến kiểu tuple chứa thông tin địa lý cơ bản về Việt Nam và Mỹ, bao gồm tên tiếng Anh, diện tích, dân số, GDP bình quân đầu người.

Ví dụ

>>> vn = ('Vietnam', 330_000, 95_000_000, 2500)
>>> us = ('USA', 9_600_000, 350_000_000, 40_000)

So với list, cách tạo tuple chỉ khác ở cặp dấu () (so với [] của list). Các phần tử của tuple có thể thuộc bất kỳ kiểu nào và cần viết tách nhau bởi dấu phẩy.

Sau đó chúng ta sử dụng các thông tin trên để viết ra đoạn giới thiệu về quốc gia:

Ví dụ

us_info = f'''Official name: {us[0]}
... Area: {us[1]} km2
... Population: {us[2]}
... GDP/capital: {us[3]} USD'''

print(us_info)

Hãy để ý cách chúng ta sử dụng các thông tin lưu trong tuple. Bạn vẫn sử dụng phép toán slice [] để truy xuất phần tử. Về hình thức không có gì khác biệt so với sử dụng list trong Python.

Nếu muốn viết ở dạng script hãy dùng code sau:

Ví dụ

vn = ('Vietnam', 330_000, 95_000_000, 2500)
us = ('USA', 9_600_000, 350_000_000, 40_000)

vn_info = f'''Official name: {vn[0]}
Area: {vn[1]} km2
Population: {vn[2]}
GDP/capital: {vn[3]} USD'''

us_info = f'''Official name: {us[0]}
Area: {us[1]} km2
Population: {us[2]}
GDP/capital: {us[3]} USD'''

print(vn_info)
print(us_info)

Kiểu dữ liệu tuple trong Python

Dữ liệu kiểu tuple trong Python có thể chứa nhiều giá trị viết trong cặp dấu ngoặc tròn (). Mỗi giá trị viết tách nhau bởi dấu phẩy.

Ví dụ

vn = ('Vietnam', 330_000, 95_000_000, 2500)
us = ('USA', 9_600_000, 350_000_000, 40_000)

Lưu ý: Nếu chỉ có 1 phần tử trong tuple bạn vẫn phải viết dấu phẩy sau nó. Nếu không viết dấu phẩy, Python sẽ không coi nó là một tuple. Ví dụ tuple với 1 phần tử: one_tuple = (100, )

Một tuple có thể không chứa phần tử nào. Khi đó nó được gọi là một tuple rỗng. Tuple rỗng được biểu diễn là (). Ví dụ, empty_tuple = ().

Các giá trị trong một tuple có thể thuộc bất kỳ kiểu dữ liệu nào (kể cả kiểu list hay tuple khác). Thường người ta vẫn dùng tuple để nhóm các dữ liệu khác nhau vào một đơn vị. Như ở trên, chúng ta nhóm tên quốc gia, diện tích, dân số, GDP bình quân vào cùng một tuple.

Trong trường hợp phần tử của một tuple có thể là một tuple khác, người ta gọi là tuple lồng nhau (nested tuple).

Ví dụ

>>> # thông tin về Singapore: tên tiếng anh, dân số, các ngôn ngữ thông dụng
>>> sg = ('Singapore', 5_639_000, ('Chinese', 'English'))

Đặc điểm quan trọng của tuple là tính bất biến (immutability).

Đặc điểm này khiến tuple không thể cập nhật một khi đã được tạo ra. Bạn chỉ có thể lấy một phần của tuple để tạo ra tuple mới chứ không thể cập nhật tuple.

Tính bất biến cũng khiến bạn không thể xóa một phần tuple. Bạn chỉ có thể xóa toàn bộ tuple bằng lệnh del như sau:

Ví dụ

>>> sg = ('Singapore', 5_639_000, ('Chinese', 'English'))
>>> del sg

Bạn có thể truy xuất các phần tử của tuple qua phép toán slice và range slice giống hệt như đối với list. Hai phép toán này đã trình bày kỹ trong bài học về list trong Python. Bạn có thể xem lại nếu không nhớ.

Ví dụ

>>> sg = ('Singapore', 5_639_000, ('Chinese', 'English'))

>>> # truy xuất 1 phần tử
>>> sg[0]
'Singapore'

>>> # truy xuất một tuple con sử dụng range slice
>>> sg[0:2]
('Singapore', 5639000)
>>> sg[:2]
('Singapore', 5639000)

>>> # đối với nested tuple
>>> sg[2] # kết quả là một tuple khác
('Chinese', 'English')
>>> sg[2][1] # truy xuất phần tử số 1 của tuple lồng
'English'

Các phép toán và hàm trên tuple

Kiểu tuple trong Python cũng hỗ trợ các phép toán giống như với list, bao gồm:

  • phép cộng tuple + trả về một tuple mới bao gồm các phần tử của cả hai tuple
  • lặp tuple * trả về một tuple mới bằng cách lặp lại các phần tử của một tuple
  • kiểm tra thành viên in – trả về True/False tùy thuộc xem giá trị có nằm trong tuple hay không

Hãy xem cách sử dụng các phép toán này qua ví dụ sau:

Ví dụ

>>> # phép cộng hai tuple trả về một tuple mới
>>> vn = ('Vietnam', 330_000, 95_000_000, 2500) + ('Vietnamese', ('ASEAN', 'UN', 'APEC'))
>>> vn
('Vietnam', 330000, 95000000, 2500, 'Vietnamese', ('ASEAN', 'UN', 'APEC'))

>>> # kiểm tra thành viên
>>> 'Vietnam' in vn
True
>>> 'Vietnamese' in vn
True

>>> # phép lặp tuple
>>> ('ha', 'ho') * 3
('ha', 'ho', 'ha', 'ho', 'ha', 'ho')

Python cung cấp sẵn các hàm làm việc với tuple, bao gồm:

  • len() – lấy số phần tử
  • max() – lấy phần tử lớn nhất
  • min() – lấy phần tử nhỏ nhất
  • tuple() – chuyển đổi list về tuple.

Hãy xem cách sử dụng các hàm trên qua ví dụ sau:

Ví dụ

>>> vn = ('Vietnam', 330000, 95000000, 2500, 'Vietnamese', ('ASEAN', 'UN', 'APEC'))
>>> len(vn)
6

>>> org = ('ASEAN', 'UN', 'APEC')
>>> # min và mã chỉ hoạt động nếu các phần tử của tuple có cùng kiểu
>>> min(org)
'APEC'
>>> max(org)
'UN'

Chú ý: min()max() chỉ hoạt động nếu tất cả phần tử của tuple có cùng kiểu (ví dụ, cùng là số hoặc cùng là xâu). Nếu không cùng kiểu, phép so sánh của các hàm này không hoạt động được. Thực tế, hai hàm này gần như không có ý nghĩa với tuple.

Lớp tuple cũng cung cấp các phương thức count() – đếm số lần xuất hiện của 1 giá trị và index() – xác định chỉ số của phần tử:

Ví dụ

>>> vn = ('Vietnam', 330000, 95000000, 2500, 'Vietnamese', ('ASEAN', 'UN', 'APEC'))
>>> vn.count('Vietnam')
1
>>> vn.index('Vietnamese')
4

Tuple hay list trong Python?

Qua các nội dung của bài này và bài học trước đó (list trong Python) bạn có thể thấy có rất nhiều điểm tương tự giữa tuple và list. Tuy nhiên, tuple và list có những điểm phân biệt rất rõ ràng. Sự khác biệt này quyết định giá trị sử dụng của từng kiểu dữ liệu.

Thứ nhất, list là kiểu dữ liệu khả biến (mutable) trong khi tuple là kiểu dữ liệu bất biến (immutable). Nghĩa là, một khi đã được tạo ra trong bộ nhớ, list có thể thay đổi còn tuple không thể thay đổi. Các thao tác biến đổi trên tuple sẽ đều tạo ra object mới chứ không thay đổi object sẵn có.

Từ khía cạnh nào đó có thể hình dung tuple là phiên bản chỉ đọc thu gọn của list.

Với đặc thù trên, list thường dùng làm kho dữ liệu cho chương trình. Ví dụ, bạn có thể đọc dữ liệu từ file vào list, thực hiện các biến đổi trên list và lưu trở lại file. Dữ liệu lưu trong list được xử lý linh hoạt uyển chuyển hơn. Bạn không thể sử dụng tuple cho mục đích này.

Trong khi đó, tuple được sử dụng để truyền dữ liệu trong chương trình. Ví dụ, nếu một hàm cần trả lại nhiều kết quả, nó có thể trả về một tuple. Kết quả trả về ở dạng tuple nhẹ, nhanh và an toàn hơn. Ở đây mặc dù có thể dùng list nhưng không khuyến khích.

Mặc dù list cho phép lưu trữ dữ liệu thuộc nhiều kiểu khác nhau, người ta thường dùng list để lưu dữ liệu có cùng kiểu. Trong khi đó, tuple thường được dùng để lưu trữ kết quả thuộc các kiểu khác biệt để truyền qua lại trong chương trình.

Ví dụ, nếu khách hàng có các thông tin về họ tên, email, số điện thoại, địa chỉ. Danh sách khách hàng (tập hợp bản ghi) nên được lưu trong list. Nếu cần truyền thông tin về một khách hàng (dữ liệu 1 bản ghi, ví dụ, trả về từ hàm) thì nên dùng tuple chứa các thông tin của khách hàng đó.

Kết luận

Bài học đã hướng dẫn cách sử dụng kiểu dữ liệu tuple trong Python và phân biệt tuple với list. Nhìn chung có thể hình dung tuple như một phiên bản chỉ đọc và đơn giản hơn của list dùng để truyền dữ liệu trong chương trình.

Bài viết này đã giúp ích cho bạn?

Advertisements