2.8. Tuple¶
Một tuple là một chuỗi giá trị bất biến, có thứ tự. Sau khi tạo, các mục bên trong không thể được thêm, xóa, hoặc thay đổi.
2.8.1. Tạo tuple¶
Sử dụng dấu ngoặc đơn (hoặc chỉ dấu phẩy) để tạo một tuple:
empty = ()
point = (3, 4)
triple = 1, 2, 3 # parentheses are optional
mixed = (1, "two", 3.14)
nested = ((1, 2), (3, 4))
2.8.1.1. Lưu ý về phần tử đơn¶
Dấu ngoặc đơn bao quanh một giá trị chỉ là dấu ngoặc đơn; điều thực sự tạo nên một tuple là dấu phẩy. Một tuple một phần tử cần có dấu phẩy đuôi:
>>> (1)
1 # just an int in parens
>>> (1,)
(1,) # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)
2.8.2. Độ dài, lập chỉ mục và cắt lát¶
Giống như danh sách và chuỗi -- len(), lập chỉ mục, cắt lát, in, và + / * đều hoạt động theo cùng một cách:
>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)
2.8.3. Tính bất biến¶
Tuple không có append, pop, sort, hay bất kỳ phương thức tại chỗ nào khác. Gán giá trị theo chỉ mục sẽ gây ra TypeError:
>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment
Để "sửa đổi" một tuple, hãy xây dựng một tuple mới với các giá trị đã thay đổi.
2.8.4. Giải nén¶
Sức mạnh chính của tuple là giải nén: gán từng mục cho một biến riêng biệt trong một câu lệnh.
Giải nén gán từng phần tử của một tuple cho một biến có tên trong một lệnh gán.¶
>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4
Vế phải có thể là bất kỳ iterable nào -- một danh sách, một chuỗi, giá trị trả về của một hàm:
>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')
Một * đứng đầu thu thập "phần còn lại" của quá trình giải nén vào một danh sách:
>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]
2.8.5. Nhiều giá trị trả về¶
Một hàm có thể trả về một tuple để cung cấp nhiều giá trị cùng một lúc; người gọi giải nén chúng khi nhận:
def size_of(rect):
return (rect[2] - rect[0], rect[3] - rect[1])
width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120
Dấu ngoặc đơn trong return là tùy chọn -- return a, b trần cũng là một tuple.
2.8.6. Tuple vs list¶
Hướng dẫn thực tế để chọn cái nào:
Tuple cho dữ liệu có hình dạng cố định, thường không đồng nhất: các điểm
(x, y), màu sắc(r, g, b), nhiều giá trị trả về, các đối số hàm được đóng gói để dùng sau.List cho dữ liệu có độ dài thay đổi, thường đồng nhất: danh sách các phép đo, hàng đợi các mục cần xử lý, bất cứ thứ gì bạn muốn thêm vào.
Tuple cũng có khả năng băm (hash) (miễn là mọi phần tử bên trong đều có thể băm), vì vậy chúng có thể được dùng làm khóa trong dict.