Kiểu dữ liệu Tuple trong Python

<p style="text-align: justify;">Sau khi đ&atilde; th&agrave;nh thạo với kiểu dữ liệu danh s&aacute;ch, trong b&agrave;i n&agrave;y, ch&uacute;ng ta sẽ tiếp tục với kiểu dữ liệu Tuple trong Python hay Python Tuple. Ở đ&acirc;y, tiếng Việt kh&ocirc;ng c&oacute; từ tương đồng cho Tuple vi vậy ở đ&acirc;y ch&uacute;ng ta sẽ giữ nguy&ecirc;n n&oacute; m&agrave; kh&ocirc;ng dịch sang thuật ngữ tiếng Việt, bới n&oacute; c&oacute; thể g&acirc;y ra sự nhập nhằng v&agrave; kh&oacute; hiểu. Nội dung của b&agrave;i n&agrave;y hướng đến:</p> <ul> <li style="text-align: justify;">Tr&igrave;nh b&agrave;y về kh&aacute;i niệm v&agrave; c&aacute;c đặc t&iacute;nh của tuple trong Python</li> <li style="text-align: justify;">C&aacute;ch tạo một đối tượng Tuple</li> <li style="text-align: justify;">Truy cập v&agrave;o một phần tử trong Tuple</li> <li style="text-align: justify;">Cắt ra một tập con trong Tuple</li> <li style="text-align: justify;">X&aacute;c định số phần tử của Tuple</li> <li style="text-align: justify;">Duyệt qua Tuple</li> </ul> <h2 style="text-align: justify;">Tuple l&agrave; g&igrave;?</h2> <p style="text-align: justify;">Về cơ bản c&oacute; thể hiểu, Tuple l&agrave; tập hợp dữ liệu hỗn hợp c&oacute; thứ tự v&agrave; kh&ocirc;ng thể thay đổi được. Một tập hợp Tuple trong Python tương tự như một tập hợp List. Sự kh&aacute;c biệt giữa hai kiểu dữ liệu n&agrave;y l&agrave; ch&uacute;ng ta kh&ocirc;ng thể thay đổi c&aacute;c phần tử trong một tập hợp Tuple trong khi ch&uacute;ng ta c&oacute; thể thay đổi c&aacute;c phần tử của một tập hợp List.</p> <p style="text-align: justify;">T&oacute;m lại tuple c&oacute; c&aacute;c t&iacute;nh chất sau đ&acirc;y:</p> <ul> <li style="text-align: justify;"><strong>C&oacute; thứ tự</strong>: Dữ liệu trong Tuple l&agrave; c&oacute; thứ tự, mỗi phần tử tương ứng với một chỉ số theo thứ tự v&agrave; được đ&aacute;nh số từ 0.</li> <li style="text-align: justify;"><strong>Kh&ocirc;ng thể thay đổi được</strong>: Dữ liệu trong Tuple l&agrave; kh&ocirc;ng thể thay đổi được, nghĩa l&agrave; ch&uacute;ng ta kh&ocirc;ng thể thay đổi hoặc x&oacute;a phần tử khỏi tuple.</li> <li style="text-align: justify;"><strong>Hỗn tạp</strong>: Tuple chấp nhận c&aacute;c phần tử thuộc nhiều kiểu dữ liệu kh&aacute;c nhau (như số nguy&ecirc;n, số thực, danh s&aacute;ch, chuỗi k&yacute; tự,...) v&agrave; c&oacute; thể truy cập được th&ocirc;ng qua chỉ số v&agrave; ph&eacute;p cắt tập con.</li> <li style="text-align: justify;"><strong>Cho ph&eacute;p sự tr&ugrave;ng lặp trong dữ liệu</strong>: C&aacute;c phần tử dữ liệu trong Tuple c&oacute; thể tr&ugrave;ng nhau.</li> </ul> <p style="text-align: justify;">Như vậy c&oacute; thể thấy về cơ bản Tuple rất giống kiểu danh s&aacute;ch List do đ&oacute;, c&aacute;c thao t&aacute;c cơ bản đối với Tuple cũng tương tự đối với Danh s&aacute;ch. Chỉ c&oacute; một số kh&aacute;c biệt trong c&aacute;ch tạo, sửa hoặc x&oacute;a một phần tử.</p> <h2 style="text-align: justify;">Tạo dữ liệu kiểu tuple</h2> <p>Ch&uacute;ng ta c&oacute; thể tạo một dữ liệu kiểu tuple theo 2 c&aacute;ch</p> <ol> <li style="text-align: justify;"><strong>Sử dụng dấu ngoặc tr&ograve;n (): </strong>Ch&uacute;ng ta c&oacute; thể tạo một tuple bằng c&aacute;ch đưa c&aacute;c phần tử của tuple v&agrave;o cặp dấu ngoặc nhọn () v&agrave; ph&acirc;n t&aacute;ch c&aacute;c phần tử bởi dấu phẩy.</li> <li style="text-align: justify;">Sử dụng phương thức tạo <code>tuple()</code>: Truyền c&aacute;c phần tử ngăn c&aacute;ch nhau bởi dấu phẩy (,) v&agrave;o <code>tuple()</code>.</li> </ol> <p style="text-align: justify;">Một tuple c&oacute; thể c&oacute; nhiều phần tử thuộc c&aacute;c kiểu dữ liệu kh&aacute;c nhau như số nguy&ecirc;n, số thực, danh s&aacute;ch, chuỗi k&yacute; tự,...</p> <p>V&iacute; dụ:</p> <pre class="language-python"><code># Tạo tuple sử dụng dấu ngoặc number_tuple = (11, 22, 21.25) print(number_tuple) string_tuple = ('Học', 'Python', 'TEK4.VN') print(string_tuple) sample_tuple = ('Python', 10, 23.15, [15, 18]) print(sample_tuple) # Tạo tuple sử dụng phương thức tuple() sample_tuple = tuple(('Python', 10, 23.15, [15, 18])) print(sample_tuple)</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>(11, 22, 21.25) ('Học', 'Python', 'TEK4.VN') ('Python', 10, 23.15, [15, 18]) ('Python', 10, 23.15, [15, 18])</code></pre> <p style="text-align: justify;">Trong v&iacute; dụ tr&ecirc;n ch&uacute;ng ta đ&atilde; tiến h&agrave;nh tạo c&aacute;c tuple theo cả 2 c&aacute;ch cho c&aacute;c dữ liệu số, chuỗi k&yacute; tự lẫn một danh s&aacute;ch con nằm b&ecirc;n trong Tuple.</p> <p style="text-align: justify;">Lưu &yacute;, khi ch&uacute;ng tạo tạo tuple với duy nhất 1 phần tử l&agrave; chuỗi k&yacute; tự th&igrave; khi đ&oacute; tuple được tạo sẽ c&oacute; kiểu l&agrave; chuỗi k&yacute; tự chứ kh&ocirc;ng phải l&agrave; một kiểu dữ liệu tuple nữa. Khi đ&oacute;, muốn trở th&agrave;nh một tuple, ch&uacute;ng ta cần phải th&ecirc;m dấu phẩy v&agrave;o đằng sau. Trường hợp n&agrave;y kh&ocirc;ng phổ biến v&agrave; &iacute;t t&iacute;nh thực tế do đ&oacute;, ch&uacute;ng ta sẽ kh&ocirc;ng n&oacute;i th&ecirc;m ở đ&acirc;y nữa.</p> <p style="text-align: justify;">Ngo&agrave;i c&aacute;c c&aacute;ch khởi tạo tuple ở tr&ecirc;n, ch&uacute;ng ta c&ograve;n một kỹ thuật kh&aacute; đặc biệt kh&aacute;c l&agrave; packing v&agrave; unpacking sẽ được tr&igrave;nh b&agrave;y trong một b&agrave;i ri&ecirc;ng, bởi đ&acirc;y l&agrave; một kỹ thuật kh&aacute; hay cho ph&eacute;p ch&uacute;ng ta giải quyết kh&aacute; nhiều vấn đề một c&aacute;ch rất nhanh gọn!</p> <h2 style="text-align: justify;">Số phần tử trong Tuple</h2> <p style="text-align: justify;">Tương tự như danh s&aacute;ch hay chuỗi k&yacute; tự, ch&uacute;ng ta cũng c&oacute; thể x&aacute;c định được số phần tử của Tuple bằng c&aacute;ch sử dụng h&agrave;m len().</p> <p style="text-align: justify;">V&iacute; dụ, x&eacute;t tuple c&oacute; 7 phần tử gồm 3 số nguy&ecirc;n, 3 chuỗi k&yacute; tự, v&agrave; 1 danh s&aacute;ch con gồm 3 phần tử:</p> <pre class="language-python"><code>tuple_sample = (1,2,3, "Học","Python", "TEK4.VN", [4,5,6]) print(len(tuple_sample))</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>7</code></pre> <h2 style="text-align: justify;">Truy cập c&aacute;c phần tử của tập hợp Tuple</h2> <p style="text-align: justify;">Tuple cũng l&agrave; một kiểu dữ liệu c&oacute; thứ tự v&agrave; được đ&aacute;nh chỉ số, do đ&oacute;, ch&uacute;ng ta cũng c&oacute; thể thực hiện việc truy cập v&agrave;o c&aacute;c phần tử trong tập hợp Tuple bằng c&aacute;c chỉ số của n&oacute;. Lưu &yacute; rằng, cũng tương tự như List v&agrave; chuỗi k&yacute; tự, chỉ số đầu ti&ecirc;n của Tuple cũng bắt đầu từ&nbsp; gi&aacute; trị l&agrave; 0. V&igrave; vậy, một tập hợp Tuple c&oacute; 6 phần tử sẽ c&oacute; c&aacute;c chỉ số từ 0 đến 5. V&agrave; do đ&oacute;, ch&uacute;ng ta chỉ c&oacute; thể sử dụng c&aacute;c chỉ số trong khoảng n&agrave;y để truy cập v&agrave;o Tuple. Việc cố gắng truy cập một chỉ số b&ecirc;n ngo&agrave;i phạm vi chỉ số của tập hợp Tuple sẽ g&acirc;y ra lỗi IndexError.</p> <p style="text-align: justify;">Chỉ số phải l&agrave; một số nguy&ecirc;n, v&igrave; vậy ch&uacute;ng ta kh&ocirc;ng thể sử dụng kiểu dữ liệu số thập ph&acirc;n hoặc c&aacute;c kiểu dữ liệu kh&aacute;c. Nếu kh&ocirc;ng chương tr&igrave;nh sẽ b&aacute;o lỗi TypeError tương tự như với List.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>vi_du = ("Python", "Javascript", "C++") print(vi_du[0]) vi_du2 = ("Python", [100, 200, 300], (400, 500, 600)) print(vi_du2[1][2]) print(vi_du2[2][2])</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Python 300 600</code></pre> <p style="text-align: justify;">Ở v&iacute; dụ tr&ecirc;n, ch&uacute;ng ta truy cập v&agrave;o phần tử đầu ti&ecirc;n của vi_du tức l&agrave; phần tử 0, v&agrave; ở c&acirc;u lệnh thứ 4, ch&uacute;ng ta truy cập v&agrave;o phần tử thứ 2 v&agrave; thứ 3 của Tuple tương ứng với chỉ số 1 v&agrave; 2. Tại đ&acirc;y, phần tử của Tuple l&agrave; một danh s&aacute;ch v&agrave; một tuple kh&aacute;c. Khi đ&oacute; muốn truy cập v&agrave;o phần tử trong danh s&aacute;ch v&agrave; tuple con n&agrave;y, ch&uacute;ng ta cũng sẻ d&ugrave;ng chỉ số tương tự với vị tr&iacute; muồn truy cập.</p> <h3 style="text-align: justify;">Truy cập Tuple với chỉ số &acirc;m</h3> <p style="text-align: justify;">Tương tự như kiểu dữ liệu List, Python cũng cho ph&eacute;p sử dụng chỉ số c&oacute; gi&aacute; trị &acirc;m cho c&aacute;c chuỗi của n&oacute;. Chỉ số -1 sẽ tham chiếu đến phần tử cuối c&ugrave;ng, -2 tham chiếu đến phần tử cuối c&ugrave;ng thứ hai,...</p> <p><img style="width: 100%; display: block; margin-left: auto; margin-right: auto;" src="../../../public_files/8ceae56d-0388-4032-94f2-e6582f309f39" alt="tuples-in-python" /></p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>vi_du = ("Python", "Javascript", "C++") print(vi_du[-2])</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Javascript</code></pre> <h2 style="text-align: justify;">Cắt v&agrave; lấy tập con của Tuple</h2> <p style="text-align: justify;">Cũng tương tự như kiểu chuỗi k&yacute; tự v&agrave; kiểu danh s&aacute;ch, ch&uacute;ng ta cũng c&oacute; thể lấy ra một phần tập con của tập hợp Tuple bằng c&aacute;ch sử dụng ph&eacute;p cắt hay dấu hai chấm.</p> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể chỉ định vị tr&iacute; bắt đầu, vị tr&iacute; kết th&uacute;c cho khoảng gi&aacute; trị chỉ số muốn lấy ra trong tuple. Đầu ra của ph&eacute;p cắt n&agrave;y sẽ cũng l&agrave; một tuple gồm c&aacute;c phần tử nằm trong khoảng chỉ số được chỉ định từ chỉ số đầu ti&ecirc;n đến chỉ số cuối c&ugrave;ng (kh&ocirc;ng bao gồm phần tử tương ứng với chỉ số cuối c&ugrave;ng).</p> <p style="text-align: justify;">Lưu &yacute; rằng, gi&aacute; trị của chỉ số lu&ocirc;n bắt đầu từ 0.</p> <p>Để hiểu hơn về kỹ thuật n&agrave;y, ch&uacute;ng ta xem x&eacute;t v&iacute; dụ sau:</p> <pre class="language-python"><code>vi_du = (100, 200, 300, 400, 500, 600) print(vi_du[0:3])</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>(100, 200, 300)</code></pre> <p style="text-align: justify;">Như ch&uacute;ng ta thấy trong v&iacute; dụ tr&ecirc;n, c&aacute;c gi&aacute; trị c&oacute; chỉ số từ 0 đến 2 được in ra v&agrave; bỏ qua chỉ số 3 ở cuối c&ugrave;ng. Ch&uacute;ng ta cũng c&oacute; thể sử dụng c&aacute;c chỉ số &acirc;m, bỏ qua c&aacute;c chỉ số bắt đầu, kết th&uacute;c hoặc bước nhảy tương tự như cắt một danh s&aacute;ch. Tuy nhi&ecirc;n, ch&uacute;ng ta n&ecirc;n hạn chế sử dụng chỉ số &acirc;m để cắt danh s&aacute;ch, hoặc tuple bởi n&oacute; sẽ g&acirc;y ra những vấn đề rắc rối kh&oacute; hiểu khi bảo tr&igrave; sau n&agrave;y.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>tuple1 = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) print(tuple1[:5]) print(tuple1[6:]) print(tuple1[0:5:2]) print(tuple1[:-5:-2])</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>(0, 1, 2, 3, 4) (6, 7, 8, 9, 10) (0, 2, 4) (10, 8)</code></pre> <h2 style="text-align: justify;">Duyệt qua c&aacute;c phần tử c&oacute; trong tập hợp kiểu Tuple</h2> <p style="text-align: justify;">Thao t&aacute;c duyệt c&aacute;c phần tử của Tuple cơ bản cũng giống như c&aacute;c thao t&aacute;c tr&ecirc;n, cũng tương tự giống như với Danh s&aacute;ch.</p> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể sử dụng v&ograve;ng lặp for để duyệt qua từng phần tử trong một tập hợp kiểu dữ liệu Tuple.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>vi_du = (100, 200, 300, [400, 500, 600]) for i in vi_du: print(i)</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>100 200 300 [400, 500, 600]</code></pre> <p>Hoặc sử dụng chỉ số để duyệt tuple:</p> <pre class="language-python"><code>tuple1 = ('Python', 'TEK4.VN', 'is', 'easy', 12, 21) for i in range(-6, 0): print(tuple1[i], end=", ") </code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Python, TEK4.VN, is, easy, 12, 21, </code></pre> <p style="text-align: justify;">Trong b&agrave;i n&agrave;y ch&uacute;ng ta đ&atilde; tr&igrave;nh b&agrave;y c&aacute;c kh&aacute;i niệm về kiểu dữ liệu Tuple trong Python cũng một một số thao t&aacute;c cơ bản như tạo danh s&aacute;ch tuple, truy cập một phần tử trong tuple, lấy 1 tập con của tuple v&agrave; duyệt qua c&aacute;c phần tử của tuple. Tiếp theo, ch&uacute;ng ta sẽ c&ugrave;ng luyện tập đ&ocirc;i ch&uacute;t tr&ecirc;n kiểu dữ liệu n&agrave;y.</p>