<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Kiểu dữ liệu trong Python&#x3A; chuỗi, số, list, tuple, set và dictionary</title>
<meta name="description" content="Kiểu dữ liệu trong Python&#x3A; chuỗi, số, list, tuple, set và dictionary - Savefile - Tin Tức -...">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Kiểu dữ liệu trong Python&#x3A; chuỗi, số, list, tuple, set và dictionary">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;kieu-du-lieu-trong-python-chuoi-so-list-tuple-set-va-dictionary-10708.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/kieu-du-lieu-trong-python-chuoi-so-list-tuple-set-va-dictionary-10708.html">
<link rel="shortcut icon" href="https://www.nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/kieu-du-lieu-trong-python-chuoi-so-list-tuple-set-va-dictionary-10708.html">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://www.nguoicodonvn2008.info/">https://www.nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Kiểu dữ liệu trong Python&#x3A; chuỗi, số, list, tuple, set và dictionary</h1>
		<ul class="list-inline">
			<li>Thứ năm - 03/07/2025 06:25</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="Kiểu dữ liệu trong Python&#x3A; chuỗi, số, list, tuple, set và dictionary" src="https://st.quantrimang.com/photos/image/holder.png" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<h1 style="text-align: justify;"><br />
<strong style="font-size: 13px;">Các kiểu dữ liệu trong Python: chuỗi, số, list, tuple, set và dictionary</strong><span style="font-size: 13px;">&nbsp;có cách sử dụng như thế nào? Hãy cùng Quantrimang.com tìm hiểu nhé!</span></h1>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;">Kiểu dữ liệu là hình thức phân loại các mục dữ liệu. Nó đại diện cho loại giá trị cho biết hoạt động nào có thể thực hiện trên một dữ liệu cụ thể. Vì mọi thứ là một đối tượng trong lập trình Python, kiểu dữ liệu thực sự là các class, còn biến là đối tượng của những class này.</p>

<p style="text-align: justify;">Python có rất nhiều kiểu dữ liệu khác nau. Nếu bạn muốn lập trình ứng dụng tốt, thì nhất định nên biết chúng.</p>

<p style="text-align: justify;">Khi làm bài kiểm tra, bạn dễ bắt gặp những câu hỏi như trong python, output của hàm sau là gì? float(&#039; -12345 &#039;) lưu ý: số lượng khoảng trắng trước số đó là 5… Vậy làm thế nào để trả lời những câu hỏi này thật chính xác? Câu trả lời rất đơn giản. Đó là bạn phải nắm vững các kiểu dữ liệu Python.</p>

<p style="text-align: justify;">Python là một ngôn ngữ lập trình đặc biệt vời nhiều kiểu dữ liệu giúp bạn tạo nên một chương trình hữu ích. Một trong số kiểu dữ liệu phổ biến nhất là:</p>

<ul>
	<li style="text-align: justify;">Số nguyên (integer): là một loại dữ liệu số vô hướng, ví dụ như 1, 2, 3, 4, 5.</li>
	<li style="text-align: justify;">Số thực (float): là một loại dữ liệu số có dấu thập phân, ví dụ như 1.5, 2.7, 3.14.</li>
	<li style="text-align: justify;">Chuỗi (string): là một loại dữ liệu chứa một chuỗi ký tự, ví dụ như &quot;hello&quot;, &quot;goodbye&quot;.</li>
	<li style="text-align: justify;">Boolean: là một loại dữ liệu có hai giá trị là True hoặc False.</li>
	<li style="text-align: justify;">Danh sách (list): là một loại dữ liệu chứa một tập hợp các giá trị, ví dụ như &#91;1, 2, 3, 4, 5&#93;.</li>
	<li style="text-align: justify;">Từ điển (dictionary): là một loại dữ liệu chứa các cặp khóa-giá trị, ví dụ như {&quot;name&quot;: &quot;John&quot;, &quot;age&quot;: 30}.</li>
</ul>

<p style="text-align: justify;">Ví dụ, bạn có thể dùng hàm&nbsp;<code>type</code>&nbsp;để kiểm tra kiểu dữ liệu của một biến như sau:</p>

<div style="text-align: justify;"><iframe allow="autoplay" allowtransparency="true" aria-label="Advertisement" bis_chainid="11" bis_depth="0" bis_id="fr_zlglg2pz86b6eo0d2el0dx" bis_precise_ad="1" bis_size="{&#039;x&#039;:129,&#039;y&#039;:1619,&#039;w&#039;:694,&#039;h&#039;:280,&#039;abs_x&#039;:129,&#039;abs_y&#039;:1619}" browsingtopics="true" data-google-container-id="a!2" frameborder="0" height="280" hspace="0" id="aswift_1" marginheight="0" marginwidth="0" name="aswift_1" sandbox="allow-scripts allow-same-origin allow-forms allow-presentation allow-popups" scrolling="no" tabindex="0" title="Advertisement" vspace="0" width="694"></iframe></div>

<pre id="pre0" style="text-align: justify;">
x = 1
print(type(x))  # in ra &quot;&lt;class &#039;int&#039;&gt;&quot;

y = 1.5
print(type(y))  # in ra &quot;&lt;class &#039;float&#039;&gt;&quot;

z = &quot;hello&quot;
print(type(z))  # in ra &quot;&lt;class &#039;str&#039;&gt;&quot;</pre>

<p style="text-align: justify;">Vì bài viết sẽ liệt kê những nội dung quan trọng nhất của tất cả các kiểu dữ liệu trong Python nên sẽ khá dài. Mỗi kiểu dữ liệu đều đi kèm với ví dụ cụ thể để bạn dễ hình dung.</p>

<p style="text-align: justify;">Hãy chắc chắn bạn đã lưu lại trang&nbsp;<a href="https://quantrimang.com/cong-nghe/python" rel="noopener" target="_blank" title="Tài liệu Python"><strong>Tài liệu Python</strong></a>&nbsp;này để cập nhật những bài mới nhất nhé. Đừng quên làm&nbsp;<a href="https://quantrimang.com/hoc/hon-100-bai-tap-python-co-loi-giai-code-mau-142456" title="Bài tập Python có code mẫu">bài tập Python</a>&nbsp;để củng cố kiến thức nữa nhé.</p>

<h2 style="text-align: justify;">&nbsp;</h2>

<div style="text-align: justify;">&nbsp;</div>

<h2 id="mcetoc_1cf9ja1n10" style="text-align: justify;">1. Biến trong Python</h2>

<p style="text-align: justify;">Biến là một vị trí trong bộ nhớ được sử dụng để lưu trữ dữ liệu (giá trị). Biến được đặt tên duy nhất để phân biệt giữa các vị trí bộ nhớ khác nhau. Các quy tắc để viết tên một biến giống như quy tắc viết các&nbsp;định danh trong Python.</p>

<p style="text-align: justify;">Trong Python, bạn không cần khai báo biến trước khi sử dụng, chỉ cần gán cho biến một giá trị và nó sẽ tồn tại. Cũng không cần phải khai báo kiểu biến, kiểu biến sẽ được nhận tự động dựa vào giá trị mà bạn đã gán cho biến.</p>

<p style="text-align: justify;"><strong>Gán giá trị cho biến:</strong></p>

<p style="text-align: justify;">Để gán giá trị cho biến ta sử dụng toán tử =. Bất kỳ loại giá trị nào cũng có thể gán cho biến hợp lệ.</p>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre1" style="text-align: justify;">
hoa = &quot;Hồng&quot;
la = 3
canh = 5.5</pre>

<p style="text-align: justify;">Phía trên là 3 câu lệnh gán, &quot;<em>Hồng</em>&quot; là một chuỗi ký tự, được gán cho biến&nbsp;<strong>hoa</strong>, 3 là số nguyên và được gán cho&nbsp;<strong>la</strong>, 5.5 là số thập phân và gán cho&nbsp;<strong>canh</strong>.</p>

<p style="text-align: justify;"><strong>Gán nhiều giá trị:</strong></p>

<p style="text-align: justify;">Trong Python bạn có thể thực hiện gán nhiều giá trị trong một lệnh như sau:</p>

<pre id="pre2" style="text-align: justify;">
hoa, la, canh = &quot;Hồng&quot;, 3, 5.5</pre>

<p style="text-align: justify;">Nếu muốn gán giá trị giống nhau cho nhiều biến thì có thể viết lệnh như sau:</p>

<pre id="pre3" style="text-align: justify;">
hoa, la, canh = 3</pre>

<p style="text-align: justify;">Lệnh trên sẽ gán giá trị 3 cho cả 3 biến là hoa, la và canh.</p>

<h2 id="mcetoc_1brlde96v0" style="text-align: justify;">2. Kiểu dữ liệu số trong Python</h2>

<h3 id="mcetoc_1cf9ja1n11" style="text-align: justify;">Các kiểu dữ liệu số trong Python</h3>

<p style="text-align: justify;">Python hỗ trợ số nguyên, số thập phân và số phức, chúng lần lượt được định nghĩa là các lớp int, float, complex trong Python. Số nguyên và số thập phân được phân biệt bằng sự có mặt hoặc vắng mặt của dấu thập phân.</p>

<p style="text-align: justify;">Ví dụ: 5 là số nguyên, 5.0 là số thập phân. Python cũng hỗ trợ số phức và sử dụng hậu tố&nbsp;<code>j</code>&nbsp;hoặc&nbsp;<code>J</code>&nbsp;để chỉ phần ảo. Ví dụ:&nbsp;<code>3+5j</code>. Ngoài&nbsp;<code>int</code>&nbsp;và&nbsp;<code>float</code>, Python hỗ trợ thêm 2 loại số nữa là&nbsp;<code>Decimal</code>&nbsp;và&nbsp;<code>Fraction</code>.</p>

<p style="text-align: justify;">Ta sẽ dùng hàm&nbsp;<code>type()</code>&nbsp;để kiểm tra xem biến hoặc giá trị thuộc lớp số nào và hàm&nbsp;<code>isinstance()</code>&nbsp;để kiểm tra xem chúng có thuộc về một class cụ thể nào không.</p>

<pre id="pre4" style="text-align: justify;">
a = 9

# Output: &lt;class &#039;int&#039;&gt;
print(type(a))

# Output: &lt;class &#039;float&#039;&gt;
print(type(5.0))

# Output: (10+2j)
b = 8 + 2j
print(b + 2)

# Kiểm tra xem b có phải là số phức không
# Output: True
print(isinstance(b, complex)) </pre>

<p style="text-align: justify;">Số nguyên trong Python không bị giới hạn độ dài, số thập phân bị giới hạn đến 16 số sau dấu thập phân.</p>

<p style="text-align: justify;">Những con số chúng là làm việc hàng ngày thường là hệ số 10, nhưng lập trình viên máy tính (thường là lập trình viên nhúng) cần làm việc với hệ thống số nhị phân, thập lục phân và bát phân. Để biểu diễn những hệ số này trong Python, ta đặt một tiền tố thích hợp trước số đó.</p>

<p style="text-align: justify;">Tiền tố hệ số cho các số Python:</p>

<table border="1" cellpadding="5">
	<tbody>
		<tr>
			<td style="text-align: justify;"><strong>Hệ thống số</strong></td>
			<td style="text-align: justify;"><strong>Tiền tố</strong></td>
		</tr>
		<tr>
			<td style="text-align: justify;">Hệ nhị phân</td>
			<td style="text-align: justify;">&#039;0b&#039; hoặc &#039;0B&#039;</td>
		</tr>
		<tr>
			<td style="text-align: justify;">Hệ bát phân</td>
			<td style="text-align: justify;">&#039;0o&#039; hoặc &#039;0O&#039;</td>
		</tr>
		<tr>
			<td style="text-align: justify;">Hệ thập lục phân</td>
			<td style="text-align: justify;">&#039;0x&#039; hoặc &#039;0X&#039;</td>
		</tr>
	</tbody>
</table>

<p style="text-align: justify;">(Bạn đặt tiền tố nhưng không có dấu &#039; &#039; nhé).</p>

<p style="text-align: justify;">Đây là ví dụ về việc sử dụng các tiền tố hệ số trong Python, và khi dùng hàm&nbsp;<code>print()</code>&nbsp;để in giá trị của chúng ra màn hình, ta sẽ nhận được số tương ứng trong hệ số 10.</p>

<div style="text-align: justify;">&nbsp;</div>

<pre id="pre5" style="text-align: justify;">
# Output: 187
print(0b10111011)

# Output: 257 (250 + 7)
print(0xFA + 0b111)

# Output: 15
print(0o17)</pre>

<h3 id="mcetoc_1cf9ja1n12" style="text-align: justify;">Chuyển đổi giữa các kiểu số trong Python</h3>

<p style="text-align: justify;">Chúng ta có thể chuyển đổi kiểu số này sang kiểu số khác. Điều này còn được gọi là cưỡng chế (coercion). Các phép toán như cộng, trừ sẽ ngầm chuyển đổi số nguyên thành số thập phân (một cách tự động) nếu có một toán tử trong phép toán là số thập phân.</p>

<p style="text-align: justify;"><strong><em>Ví dụ</em></strong>: Nếu bạn thực hiện phép cộng giữa số nguyên là 2 và số thập phân là 3.0, thì 2 sẽ bị cưỡng chế chuyển thành số thập phân 2.0 và kết quả trả về sẽ là số thập phân 5.0.</p>

<pre id="pre6" style="text-align: justify;">
&gt;&gt;&gt; 2 + 3.0
5.0</pre>

<p style="text-align: justify;">Ta có thể sử dụng các&nbsp;hàm Python tích hợp sẵn&nbsp;như&nbsp;<code>int()</code>,&nbsp;<code>float()</code>&nbsp;và&nbsp;<code>complex()</code>&nbsp;để chuyển đổi giữa các kiểu số một cách rõ ràng. Những hàm này thậm chí có thể chuyển đổi từ các chuỗi.</p>

<pre id="pre7" style="text-align: justify;">
&gt;&gt;&gt; int(3.6)
3
&gt;&gt;&gt; int(-1.2)
-1
&gt;&gt;&gt; float(7)
7.0
&gt;&gt;&gt; complex(&#039;2+8j&#039;)
(2+8j)</pre>

<p style="text-align: justify;">Khi chuyển đổi từ số thập phân sang số nguyên, số sẽ bị bỏ bớt, chỉ lấy phần nguyên.</p>

<h3 id="mcetoc_1cf9ja1n13" style="text-align: justify;">Mô-đun Decimal trong Python</h3>

<p style="text-align: justify;">Class float được tích hợp trong Python có thể khiến chúng ta ngạc nhiên đôi chút. Thông thường nếu tính tổng 1.1 và 2.2 ta nghĩ kết quả sẽ là 3.3, nhưng có vẻ không phải vậy. Nếu bạn kiểm tra tính đúng sai của phép toán này trong Python, sẽ nhận được kết quả là False.</p>

<pre id="pre8" style="text-align: justify;">
&gt;&gt;&gt; (1.1 + 2.2) == 3.3
False</pre>

<p style="text-align: justify;"><strong>Chuyện gì xảy ra vậy?</strong></p>

<p style="text-align: justify;">Điều này là do, các số thập phân được thực hiện trong phần cứng máy tính dưới dạng phân số nhị phân, vì máy tính chỉ hiểu các số nhị phân (0 và 1) nên hầu hết các phân số thập phân mà chúng ta biết, không thể được lưu trữ chính xác trong máy tính.</p>

<p style="text-align: justify;">Ví dụ, ta không thể biểu diễn phân số 1/3 dưới dạng số thập phân, vì nó là một số thập phân vô hạn tuần hoàn, với các số sau dấu thập phân dài vô hạn, nên ta chỉ có thể ước tính nó.</p>

<p style="text-align: justify;">Khi chuyển đổi phần thập phân 0.1, sẽ dẫn đến phần nhị phân dài vô hạn của 0.000110011001100110011... và máy tính chỉ lưu trữ một phần số hữu hạn sau dấu . của nó thôi. Do đó, số được lưu trữ chỉ xấp xỉ 0.1 chứ không bao giờ bằng 0.1. Đó là lý do vì sao, phép cộng chúng ta nói đến ở trên không đưa ra kết quả như chúng ta mong đợi. Đó là giới hạn của phần cứng máy tính chứ không phải lỗi của Python.</p>

<p style="text-align: justify;">Giờ bạn thử gõ phép cộng trên vào Python xem kết quả trả về là bao nhiêu nhé:</p>

<pre id="pre9" style="text-align: justify;">
&gt;&gt;&gt; 1.1+2.2
3.3000000000000003</pre>

<p style="text-align: justify;">Để khắc phục vấn đề này, chúng ta có thể sử dụng mô-đun Decimal trong Python. Trong khi số float chỉ lấy 16 số sau dấu thập phân thì mô-đun Decimal cho phép tùy chỉnh độ dài của số.</p>

<pre id="pre10" style="text-align: justify;">
import decimal

# Output: 0.1
print(0.1)

# Output: 0.1000000000000000055511151231257827021181583404541015625
print(decimal.Decimal(0.1))</pre>

<p style="text-align: justify;">Mô-đun này được sử dụng khi chúng ta muốn thực hiện các phép toán ở hệ số thập phân để có kết quả như đã học ở trường.</p>

<p style="text-align: justify;">Điều này cũng khá quan trọng, ví dụ như 25.50kg sẽ chính xác hơn 25.5kg, vì 2 chữ số thập phân vẫn chính xác hơn 1 chữ số.</p>

<pre id="pre11" style="text-align: justify;">
from decimal import Decimal
# Output: 3.3
print(Decimal(&#039;1.1&#039;) + Decimal(&#039;2.2&#039;))

# Output: 10.000
print(Decimal(&#039;4.0&#039;) * Decimal(&#039;2.50&#039;))</pre>

<p style="text-align: justify;">Nếu muốn code ngắn gọn hơn, bạn có thể nhập mô-đun Decimal và&nbsp;sửa tên mô-đun&nbsp;thành D.</p>

<pre id="pre12" style="text-align: justify;">
from decimal import Decimal as D
# Output: 3.3
print(D(&#039;1.1&#039;) + D(&#039;2.2&#039;))

# Output: 10.000
print(D(&#039;4.0&#039;) * D(&#039;2.50&#039;))</pre>

<p style="text-align: justify;">Trong code này ta nhập mô-đun Decimal và sửa tên nó thành D, kết quả không đổi so với code trên.</p>

<p style="text-align: justify;">Bạn có thể thắc mắc trong phần phép nhân, tại sao không sử dụng số Decimal để nhân lại phải thêm số 0 vào sau 4 và cả 2.5. Câu trả lời là tính hiệu quả, các phép toán với số float được hiện nhanh hơn các phép toán Decimal.</p>

<div style="text-align: justify;">&nbsp;</div>

<h3 id="mcetoc_1cf9ja1n14" style="text-align: justify;">Khi nào nên sử dụng Decimal thay cho float?</h3>

<p style="text-align: justify;">Ta thường sử dụng Decimal trong các trường hợp sau:</p>

<ul>
	<li style="text-align: justify;">Khi tạo ứng dụng tài chính, cần biểu diễn phần thập phân chính xác.</li>
	<li style="text-align: justify;">Khi muốn kiểm soát mức độ chính xác của số.</li>
	<li style="text-align: justify;">Khi muốn thực hiện các phép toán giống như đã học ở trường.</li>
</ul>

<h3 id="mcetoc_1cf9ja1n15" style="text-align: justify;">Phân số trong Python</h3>

<p style="text-align: justify;">Python cung cấp các phép toán liên quan đến phân số thông qua mô-đun fractions. Một phân số có tử số và mẫu số, cả hai đều là số nguyên. Ta có thể tạo đối tượng phân số (Fraction) theo nhiều cách khác nhau:</p>

<pre id="pre13" style="text-align: justify;">
import fractions

# Tạo phân số từ số thập phân
print(fractions.Fraction(4.5))
# Output: 9/2

# Tạo phân số từ số nguyên
# Code by Quantrimang.com
print(fractions.Fraction(9))
# Output: 9

# Tạo phân số bằng cách khai báo tử, mẫu số
print(fractions.Fraction(2,5))
# Output: 2/5</pre>

<p style="text-align: justify;">Khi tạo phân số từ float, ta có thể nhận được những kết quả không bình thường, điều này là do hạn chế của phần cứng máy tính như đã thảo luận trong phần mô-đun decimal.</p>

<p style="text-align: justify;">Đặc biệt, bạn có thể khởi tạo một phân số từ string. Đây là cách khởi tạo được ưa thích khi sử dụng số thập phân.</p>

<pre id="pre14" style="text-align: justify;">
import fractions

# Khởi tạo phân số từ float
print(fractions.Fraction(0.1))
# Output: 3602879701896397/36028797018963968

# Khởi tạo phân số từ string
# Code by Quantrimang.com
print(fractions.Fraction(&#039;0.1&#039;))
# Output: 1/10</pre>

<p style="text-align: justify;">Kiểu dữ liệu phân số hỗ trợ đầy đủ các phép toán cơ bản như cộng, trừ, nhân, chia, logic:</p>

<pre id="pre15" style="text-align: justify;">
# Output: 1
print(F(2,5) + F(3,5))
# Output: 3/5
print(F(2,5) + F(1,5))
# Output: 7/1
print(1 / F(3,7))
# Output: False
print(F(-2,9) &gt; 0)
# Output: True
print(F(-2,9) &lt; 0)</pre>

<h3 id="mcetoc_1cf9ja1n16" style="text-align: justify;">Toán học trong Python</h3>

<p style="text-align: justify;">Python cung cấp các mô-đun math và random để giải quyết các vấn đề toán học khác như lượng giác, logarit, xác suất và thống kê, v.v... Vì mô-đun math có khá nhiều hàm và thuộc tính, nên mình tính sẽ làm một bài riêng để liệt kê chúng. Dưới đây là ví dụ về math trong Python.</p>

<pre id="pre16" style="text-align: justify;">
from fractions import Fraction as F
import math

# Output: 3.141592653589793
print(math.pi)
# Output: -1.0
print(math.cos(math.pi))
# Output: 22026.465794806718
print(math.exp(10))
# Output: 2.0
print(math.log2(4))
# Output: 1.1752011936438014
print(math.sinh(1))
# Output: 40320
print(math.factorial(8))</pre>

<h3 id="mcetoc_1cf9ja1n17" style="text-align: justify;">Sử dụng trình thông dịch như máy tính bỏ túi</h3>

<p style="text-align: justify;">Trình thông dịch hoạt động như một máy tính đơn giản: Bạn có thể nhập vào một phép tính và nó sẽ viết ra giá trị. Cú pháp biểu thức khá đơn giản: các toán tử như +, -, * và / làm việc giống như trong hầu hết các ngôn ngữ lập trình khác (Pascal, C), dấu ngoặc đơn () có thể được sử dụng để nhóm. Ví dụ:</p>

<pre id="pre17" style="text-align: justify;">
&gt;&gt;&gt; 2 + 2
4
&gt;&gt;&gt; 50 - 5*6
20
&gt;&gt;&gt; (50 - 5*6) / 4
5.0
&gt;&gt;&gt; 8 / 5 # phép chia luôn trả về một số dạng thập phân với dấu chấm
1.6</pre>

<p style="text-align: justify;">Số nguyên (ví dụ như&nbsp;<code>2</code>,&nbsp;<code>4</code>,&nbsp;<code>20</code>) có kiểu&nbsp;<code>int</code>, số dạng thập phân (như&nbsp;<code>5.0</code>,&nbsp;<code>1.6</code>) có kiểu&nbsp;<code>float</code>.</p>

<p style="text-align: justify;">Phép chia (<code>/</code>) luôn luôn trả về kiểu float. Để thực hiện phép chia lấy phần nguyên (loại bỏ các số sau dấu thập phân) bạn có thể sử dụng toán tử<code>&nbsp;//</code>; để tính phần dư thì sử dụng&nbsp;<code>%</code>&nbsp;như ví dụ dưới đây:</p>

<pre id="pre18" style="text-align: justify;">
&gt;&gt;&gt; 17 / 3 # phép chia thường trả về số thập phân
5.666666666666667
&gt;&gt;&gt;
&gt;&gt;&gt; 17 // 3 # phép chia lấy số nguyên, loại bỏ phần sau dấu thập phân
5
&gt;&gt;&gt; 17 % 3 # toán tử % trả về số dư của phép chia
2
&gt;&gt;&gt; 5 * 3 + 2 # thương * số chia + số dư
17</pre>

<p style="text-align: justify;">Với Python, bạn có thể sử dụng toán tử&nbsp;<code>**</code>&nbsp;để tính số mũ:</p>

<pre id="pre19" style="text-align: justify;">
&gt;&gt;&gt; 5 ** 2 # 5 bình phương
25
&gt;&gt;&gt; 2 ** 7 # 2 mũ 7
128</pre>

<p style="text-align: justify;">Dấu bằng&nbsp;<code>=</code>&nbsp;được sử dụng để gán giá trị cho 1 biến. Sau đó, không có kết quả nào được hiển thị trước dấu nhắc lệnh tiếp theo:</p>

<pre id="pre20" style="text-align: justify;">
&gt;&gt;&gt; width = 20
&gt;&gt;&gt; height = 5 * 9
&gt;&gt;&gt; width * height
900</pre>

<p style="text-align: justify;">Nếu một biến không được định nghĩa (gán giá trị), cố gắng sử dụng biến đó, bạn sẽ nhận được lỗi sau:</p>

<pre id="pre21" style="text-align: justify;">
&gt;&gt;&gt; n # bạn đang cố truy cập vào biến n chưa được gán giá trị
Traceback (most recent call last):
File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;
NameError: name &#039;n&#039; is not defined</pre>

<p style="text-align: justify;">Python hỗ trợ đầy đủ cho dấu chấm động, phép tính có cả số nguyên và số thập phân thì kết quả sẽ trả về số dưới dạng thập phân (nguyên văn: toán tử với toán hạng kiểu hỗn hợp chuyển đổi toán hạng số nguyên sang số thập phân):</p>

<pre id="pre22" style="text-align: justify;">
&gt;&gt;&gt; 4 * 3.75 - 1
14.0</pre>

<p style="text-align: justify;">Trong chế độ tương tác, biểu thức được in ra cuối cùng sẽ được gán cho biến&nbsp;<code>_</code>, giúp dễ dàng thực hiện các phép tính tiếp theo hơn. Ví dụ:</p>

<pre id="pre23" style="text-align: justify;">
&gt;&gt;&gt; tax = 12.5 / 100
&gt;&gt;&gt; price = 100.50
&gt;&gt;&gt; price * tax
12.5625
&gt;&gt;&gt; price + _
113.0625
&gt;&gt;&gt; round(_, 2)
113.06</pre>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;">Bạn nên coi biến này là read-only, đừng gán giá trị cho nó - vì nếu tạo ra một biến cùng tên nó sẽ chiếm mất biến mặc định này và không còn làm được những thứ hay ho như trên nữa.</p>

<h2 id="mcetoc_1brlde96v2" style="text-align: justify;">3. Chuỗi (string)</h2>

<p style="text-align: justify;">String trong Python là một dãy các ký tự. Máy tính không xử lý các ký tự, chúng chỉ làm việc với số nhị phân. Dù bạn có thể nhìn thấy các ký tự trên màn hình, nhưng chúng được lưu trữ và xử lý nội bộ dưới dạng kết hợp của số 0 và 1. Việc chuyển đổi ký tự thành số được gọi là mã hóa và quá trình ngược lại được gọi là giải mã. ASCII và Unicode là 2 trong số những mã hóa phổ biến thường được sử dụng.</p>

<p style="text-align: justify;">Trong Python, string là một dãy các ký tự Unicode. Unicode bao gồm mọi ký tự trong tất cả các ngôn ngữ và mang lại tính đồng nhất trong mã hóa.</p>

<h3 id="mcetoc_1ckbn8jek0" style="text-align: justify;">Cách tạo string trong Python</h3>

<p style="text-align: justify;">Bên cạnh số, Python cũng có thể thao tác với chuỗi, được biểu diễn bằng nhiều cách. Chúng có thể được để trong dấu nháy đơn (<code>&#039;...&#039;</code>) hoặc kép (<code>&quot;...&quot;</code>) với cùng một kết quả.&nbsp;<code>\</code>&nbsp;được sử dụng để &quot;trốn (escape)&quot; 2 dấu nháy này.</p>

<pre id="pre24" style="text-align: justify;">
&gt;&gt;&gt; &#039;spam eggs&#039; # dấu nháy đơn
&#039;spam eggs&#039;
&gt;&gt;&gt; &#039;doesn\&#039;t&#039; # sử dụng \&#039; để viết dấu nháy đơn...
&quot;doesn&#039;t&quot;
&gt;&gt;&gt; &quot;doesn&#039;t&quot; # ...hoặc sử dụng dấu nháy kép
&quot;doesn&#039;t&quot;
&gt;&gt;&gt; &#039;&quot;Yes,&quot; he said.&#039;
&#039;&quot;Yes,&quot; he said.&#039;
&gt;&gt;&gt; &quot;\&quot;Yes,\&quot; he said.&quot;
&#039;&quot;Yes,&quot; he said.&#039;
&gt;&gt;&gt; &#039;&quot;Isn\&#039;t,&quot; she said.&#039;
&#039;&quot;Isn\&#039;t,&quot; she said.&#039;</pre>

<p style="text-align: justify;">Trong trình thông dịch tương tác, chuỗi kết quả bao gồm phần trong dấu ngoặc kép và các ký tự đặc biệt &quot;trốn&quot; được nhờ sử dụng \. Dù đầu ra trông có vẻ hơi khác với đầu vào (dấu nháy kèm theo có thể thay đổi) nhưng hai chuỗi này là tương đương. Chuỗi được viết trong dấu ngoặc kép khi chuỗi chứa dấu nháy đơn và không có dấu nháy kép), ngược lại nó sẽ được viết trong dấu nháy đơn. Hàm print() tạo chuỗi đầu ra dễ đọc hơn, bằng cách bỏ qua dấu nháy kèm theo và in các ký tự đặc biệt, đã &quot;trốn&quot; được dấu nháy:</p>

<pre id="pre25" style="text-align: justify;">
&gt;&gt;&gt; &#039;&quot;Isn\&#039;t,&quot; she said.&#039;
&#039;&quot;Isn\&#039;t,&quot; she said.&#039;
&gt;&gt;&gt; print(&#039;&quot;Isn\&#039;t,&quot; she said.&#039;)
&quot;Isn&#039;t,&quot; she said.
&gt;&gt;&gt; s = &#039;First line.\nSecond line.&#039; # \n nghĩa là dòng mới
&gt;&gt;&gt; s # không có print(), \n sẽ được viết trong kết quả đầu ra
&#039;First line.\nSecond line.&#039;
&gt;&gt;&gt; print(s) # có print(), \n sẽ tạo ra dòng mới
First line.
Second line.</pre>

<p style="text-align: justify;">Nếu không muốn các ký tự được thêm vào bởi&nbsp;<code>\</code>&nbsp;được trình thông dịch hiểu là ký tự đặc biệt thì sử dụng chuỗi raw bằng cách thêm&nbsp;<code>r</code>&nbsp;vào trước dấu nháy đầu tiên:</p>

<pre id="pre26" style="text-align: justify;">
&gt;&gt;&gt; print(&#039;C:\some\name&#039;) # ở đây \n là dòng mới!
C:\some
ame
&gt;&gt;&gt; print(r&#039;C:\some\name&#039;) # thêm r trước dấu nháy
C:\some\name</pre>

<p style="text-align: justify;">Chuỗi ký tự dạng chuỗi có thể viết trên nhiều dòng bằng cách sử dụng 3 dấu nháy:<code>&nbsp;&quot;&quot;&quot;...&quot;&quot;&quot;</code>&nbsp;hoặc&nbsp;<code>&#039;&#039;&#039;...&#039;&#039;&#039;</code>. Kết thúc dòng tự động bao gồm trong chuỗi, nhưng có thể ngăn chặn điều này bằng cách thêm&nbsp;<code>\</code>&nbsp;vào cuối dòng. Ví dụ:</p>

<pre id="pre27" style="text-align: justify;">
print(&quot;&quot;&quot;\
Usage: thingy &#91;OPTIONS&#93;
-h Display this usage message
-H hostname Hostname to connect to
&quot;&quot;&quot;)</pre>

<p style="text-align: justify;">Đây là kết quả (dòng mới ban đầu không được tính):</p>

<p style="text-align: justify;"><img alt="Viết chuỗi ký tự trên nhiều dòng trong Python" data-i="0" data-src="https://st.quantrimang.com/photos/image/2017/10/10/viet-chuoi-ky-tu-tren-nhieu-dong-python.png" height="295" src="https://st.quantrimang.com/photos/image/holder.png" width="650" /></p>

<p style="text-align: justify;">Đây là danh sách tất cả các ký tự thoát (escape sequence) được Python hỗ trợ:</p>

<table border="1" cellpadding="5">
	<tbody>
		<tr>
			<th scope="col" style="text-align: justify;">Escape Sequence</th>
			<th scope="col" style="text-align: justify;">Mô tả</th>
		</tr>
		<tr>
			<td style="text-align: justify;">\newline</td>
			<td style="text-align: justify;">Dấu gạch chéo ngược và dòng mới bị bỏ qua</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\\</td>
			<td style="text-align: justify;">Dấu gạch chéo ngược</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\&#039;</td>
			<td style="text-align: justify;">Dấu nháy đơn</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\&quot;</td>
			<td style="text-align: justify;">Dấu nháy kép</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\a</td>
			<td>
			<p style="text-align: justify;">ASCII Bell</p>
			</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\b</td>
			<td style="text-align: justify;">ASCII Backspace</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\f</td>
			<td style="text-align: justify;">ASCII Formfeed</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\n</td>
			<td style="text-align: justify;">ASCII Linefeed</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\r</td>
			<td style="text-align: justify;">ASCII Carriage Return</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\t</td>
			<td style="text-align: justify;">ASCII Horizontal Tab</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\v</td>
			<td style="text-align: justify;">ASCII Vertical Tab</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\ooo</td>
			<td style="text-align: justify;">Ký tự có giá trị bát phân là ooo</td>
		</tr>
		<tr>
			<td style="text-align: justify;">\xHH</td>
			<td style="text-align: justify;">Ký tự có giá trị thập lục phân là HH</td>
		</tr>
	</tbody>
</table>

<p style="text-align: justify;">Ví dụ: Hãy chạy từng lệnh riêng lẻ ngay trong trình biên dịch để thấy kết quả bạn nhé.</p>

<pre id="pre28" style="text-align: justify;">
&gt;&gt;&gt; print(&quot;C:\\Python32\\Quantrimang.com&quot;)
C:\Python32\Quantrimang.com
&gt;&gt;&gt; print(&quot;In dòng này\nthành 2 dòng&quot;)
In dòng này
thành 2 dòng
&gt;&gt;&gt; print(&quot;In giá trị \x48\x45\x58&quot;)
In giá trị HEX
&gt;&gt;&gt; </pre>

<h3 id="mcetoc_1cu3o3ddc0" style="text-align: justify;">Cách truy cập vào phần tử của chuỗi</h3>

<p style="text-align: justify;">Các chuỗi có thể được lập chỉ mục với ký tự đầu tiên được đánh số 0. Không có kiểu ký tự riêng biệt, mỗi ký tự đơn giản là một con số:</p>

<pre id="pre29" style="text-align: justify;">
&gt;&gt;&gt; word = &#039;Python&#039;
&gt;&gt;&gt; word&#91;0&#93; # ký tự ở vị trí số 0
&#039;P&#039;
&gt;&gt;&gt; word&#91;5&#93; # ký tự ở vị trí số 5
&#039;n&#039; </pre>

<p style="text-align: justify;">Chỉ số cũng có thể là số âm, bắt đầu đếm từ bên phải:</p>

<pre id="pre30" style="text-align: justify;">
&gt;&gt;&gt; word&#91;-1&#93; # last character
&#039;n&#039;
&gt;&gt;&gt; word&#91;-2&#93; # second-last character
&#039;o&#039;
&gt;&gt;&gt; word&#91;-6&#93;
&#039;P&#039;</pre>

<p style="text-align: justify;">Lưu ý rằng vì -0 cũng tương tự như 0, nên các chỉ số âm bắt đầu từ -1.</p>

<p style="text-align: justify;">Ngoài việc đánh số, thì cắt lát cũng được hỗ trợ. Trong khi index được sử dụng để lấy các ký tự riêng lẻ thì cắt lát sẽ cho phép bạn lấy chuỗi con:</p>

<pre id="pre31" style="text-align: justify;">
&gt;&gt;&gt; word&#91;0:2&#93; # các ký tự từ vị trí 0 (bao gồm) đến 2 (loại trừ)
&#039;Py&#039;
&gt;&gt;&gt; word&#91;2:5&#93; # các ký tự từ vị trí 2 (bao gồm) đến 5 (loại trừ)
&#039;tho&#039;</pre>

<p style="text-align: justify;">Hãy để ý đến cách các ký tự được giữ lại và loại trừ. Nó luôn đảm bảo rằng&nbsp;<code>s&#91;:i&#93; + s&#91;i:&#93;</code>&nbsp;bằng&nbsp;<code>s</code>:</p>

<pre id="pre32" style="text-align: justify;">
&gt;&gt;&gt; word&#91;:2&#93; + word&#91;2:&#93;
&#039;Python&#039;
&gt;&gt;&gt; word&#91;:4&#93; + word&#91;4:&#93;
&#039;Python&#039;</pre>

<p style="text-align: justify;">Các chỉ số trong cắt chuỗi có thiết lập mặc định khá hữu ích, có 2 chỉ số bị bỏ qua theo mặc định, là 0 và kích thước của chuỗi được cắt.</p>

<pre id="pre33" style="text-align: justify;">
&gt;&gt;&gt; word&#91;:2&#93; # các ký tự từ đầu đến vị trí thứ 2 (loại bỏ)
&#039;Py&#039;
&gt;&gt;&gt; word&#91;4:&#93; # các ký tự từ vị trí thứ 4(lấy) đến hết
&#039;on&#039;
&gt;&gt;&gt; word&#91;-2:&#93; # các ký tự thứ hai tính từ cuối lên (lấy) đến hết
&#039;on&#039;</pre>

<p style="text-align: justify;">Một cách khác để ghi nhớ cách thức cắt chuỗi làm việc là hình dung các chỉ số như là vách ngăn giữa các ký tự, với ký tự ngoài cùng bên trái được đánh số 0. Khi đó, ký tự cuối cùng bên phải, trong chuỗi n ký tự sẽ có chỉ số n, ví dụ:</p>

<div style="text-align: justify;">&nbsp;</div>

<pre id="pre34" style="text-align: justify;">
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1</pre>

<p style="text-align: justify;">Hàng đầu tiên của số mang đến vị trí của chỉ số từ 0 đến 6 trong chuỗi. Hàng thứ hai là các chỉ số âm tương ứng. Khi cắt từ i đến j sẽ bao gồm tất cả các ký tự nằm giữa i và j, tương ứng.</p>

<p style="text-align: justify;">Đối với các chỉ số không âm, chiều dài của một lát cắt là sự chênh lệch của các chỉ số, nếu cả hai đều nằm trong giới hạn. Ví dụ, chiều dài của word&#91;1:3&#93; là 2.</p>

<p style="text-align: justify;">Cố gắng sử dụng một chỉ mục quá lớn sẽ trả về kết quả lỗi:</p>

<pre id="pre35" style="text-align: justify;">
&gt;&gt;&gt; word&#91;42&#93; # từ chỉ có 6 ký tự
Traceback (most recent call last):
File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;
IndexError: string index out of range</pre>

<p style="text-align: justify;">Tuy nhiên, các chỉ mục bên ngoài phạm vi lát cắt vẫn được xử lý gọn gàng khi được sử dụng để cắt:</p>

<pre id="pre36" style="text-align: justify;">
&gt;&gt;&gt; word&#91;4:42&#93; # cắt ký tự từ vị trí thứ 4 đến 42
&#039;on&#039;
&gt;&gt;&gt; word&#91;42:&#93; # cắt ký tự sau vị trí 42
&#039;&#039;</pre>

<h3 id="mcetoc_1cu3o7o801" style="text-align: justify;">Thay đổi hoặc xóa chuỗi</h3>

<p style="text-align: justify;">Các chuỗi Python không thể thay đổi - chúng là cố định. Vì vậy, nếu cứ cố tình gán một ký tự nào đó cho vị trí đã được lập chỉ mục thì bạn sẽ nhận được thông báo lỗi:</p>

<pre id="pre37" style="text-align: justify;">
&gt;&gt;&gt; word&#91;0&#93; = &#039;J&#039;
...
TypeError: &#039;str&#039; object does not support item assignment
&gt;&gt;&gt; word&#91;2:&#93; = &#039;py&#039;
...
TypeError: &#039;str&#039; object does not support item assignment</pre>

<p style="text-align: justify;">Nếu cần một chuỗi khác, cách tốt nhất là tạo mới:</p>

<pre id="pre38" style="text-align: justify;">
&gt;&gt;&gt; &#039;J&#039; + word&#91;1:&#93;
&#039;Jython&#039;
&gt;&gt;&gt; word&#91;:2&#93; + &#039;py&#039;
&#039;Pypy&#039;</pre>

<p style="text-align: justify;">Bạn không thể xóa hay loại bỏ ký tự khỏi chuỗi, nhưng giống như tuple, bạn có thể xóa toàn bộ chuỗi, bằng cách sử dụng từ khóa del:</p>

<pre id="pre39" style="text-align: justify;">
qtm_string = &#039;quantrimang.com&#039;
del qtm_string
# Output: NameError: name &#039;qtm_string&#039; is not defined
qtm_string</pre>

<h3 id="mcetoc_1ckbn8jek3" style="text-align: justify;">Nối chuỗi</h3>

<p style="text-align: justify;">Các chuỗi có thể được nối với nhau bằng toán tử&nbsp;<code>+</code>&nbsp;và thay thế bằng<code>&nbsp;*</code>:</p>

<pre id="pre40" style="text-align: justify;">
&gt;&gt;&gt; # thêm 3 &#039;un&#039; vào sau &#039;ium&#039;
&gt;&gt;&gt; 3 * &#039;un&#039; + &#039;ium&#039;
&#039;unununium&#039;</pre>

<p style="text-align: justify;">Hai hoặc nhiều ký tự dạng chuỗi (tức là ký tự trong dấu nháy) cạnh nhau được nối tự động.</p>

<pre id="pre41" style="text-align: justify;">
&gt;&gt;&gt; &#039;Py&#039; &#039;thon&#039;
&#039;Python&#039;</pre>

<p style="text-align: justify;">Tính năng trên chỉ làm việc với chuỗi dạng chuỗi (literal), không áp dụng với biến hay biểu thức:</p>

<pre id="pre42" style="text-align: justify;">
&gt;&gt;&gt; prefix = &#039;Py&#039;
&gt;&gt;&gt; prefix &#039;thon&#039; # không thể nối một biến với một chuỗi
...
SyntaxError: invalid syntax
&gt;&gt;&gt; (&#039;un&#039; * 3) &#039;ium&#039;
...
SyntaxError: invalid syntax</pre>

<p style="text-align: justify;">Nếu muốn ghép nối các biến với nhau hoặc biến với chuỗi hãy sử dụng dấu<code>&nbsp;+</code>:</p>

<pre id="pre43" style="text-align: justify;">
&gt;&gt;&gt; prefix + &#039;thon&#039;
&#039;Python&#039;</pre>

<p style="text-align: justify;">Tính năng này đặc biệt hữu ích khi muốn bẻ các chuỗi dài thành chuỗi ngắn hơn:</p>

<pre id="pre44" style="text-align: justify;">
&gt;&gt;&gt; text = (&#039;Put several strings within parentheses &#039;
... &#039;to have them joined together.&#039;)
&gt;&gt;&gt; text
&#039;Put several strings within parentheses to have them joined together.&#039;</pre>

<p style="text-align: justify;">Nếu muốn nối các chuỗi trong nhiều dòng khác nhau, hãy sử dụng dấu ngoặc đơn:</p>

<pre id="pre45" style="text-align: justify;">
&gt;&gt;&gt; # sử dụng ()
&gt;&gt;&gt; s = (&#039;Xin &#039;
... &#039;chào!&#039;)
&gt;&gt;&gt; s
&#039;Xin chào!&#039;</pre>

<h3 id="mcetoc_1ckbn8jek4" style="text-align: justify;">Lặp và kiểm tra phần tử của chuỗi</h3>

<p style="text-align: justify;">Giống list và tuple, bạn cũng sử dụng vòng lặp for khi cần lặp qua một chuỗi, như ví dụ đếm số ký tự &quot;i&quot; trong chuỗi dưới đây:</p>

<pre id="pre46" style="text-align: justify;">
count = 0
for letter in &#039;Quantrimang.com&#039;:
if(letter == &#039;i&#039;):
count += 1
# Output: Có 1 chữ i được tìm thấy
print(&#039;Có&#039;, count,&#039;chữ i được tìm thấy&#039;)</pre>

<p style="text-align: justify;">Để kiểm tra một chuỗi con có trong chuỗi hay chưa, hãy dùng từ khóa in, như sau:</p>

<pre id="pre47" style="text-align: justify;">
&gt;&gt;&gt; &#039;quantrimang&#039; in &#039;quantrimang.com&#039;
True
&gt;&gt;&gt; &#039;python&#039; in &#039;quantrimang.com&#039;
False
&gt;&gt;&gt; </pre>

<h3 id="mcetoc_1ckbn8jek5" style="text-align: justify;">Hàm Python tích hợp sẵn để làm việc với chuỗi</h3>

<p style="text-align: justify;">Có 2 hàm thường dùng nhất khi làm việc với string trong Python là enumerate() và len().</p>

<p style="text-align: justify;">Hàm&nbsp;<code>len()</code>&nbsp;được tích hợp trong Python, sẽ trả về độ dài của chuỗi:</p>

<pre id="pre48" style="text-align: justify;">
&gt;&gt;&gt; s = &#039;supercalifragilisticexpialidocious&#039;
&gt;&gt;&gt; len(s)
34</pre>

<p style="text-align: justify;">Hàm enumerate() trả về đối tượng liệt kê, chứa cặp giá trị và index của phần tử trong string, khá hữu ích trong khi lặp.</p>

<pre id="pre49" style="text-align: justify;">
qtm_str = &#039;Python&#039;

# enumerate()
qtm_enum = list(enumerate(qtm_str))

# Output: list(enumerate(qtm_str) = &#91;(0, &#039;P&#039;), (1, &#039;y&#039;), (2, &#039;t&#039;), (3, &#039;h&#039;), (4, &#039;o&#039;), (5, &#039;n&#039;)&#93;
print(&#039;list(enumerate(qtm_str) = &#039;, qtm_enum)</pre>

<h3 id="mcetoc_1ckbn8jek6" style="text-align: justify;">Phương thức format() để định dạng chuỗi</h3>

<p style="text-align: justify;">Phương thức format() rất linh hoạt và đầy sức mạnh khi dùng để định dạng chuỗi. Định dạng chuỗi chứa dấu {} làm trình giữ chỗ hoặc trường thay thế để nhận giá trị thay thế. Bạn cũng có thể sử dụng đối số vị trí hoặc từ khóa để chỉ định thứ tự.</p>

<pre id="pre50" style="text-align: justify;">
# default(implicit) order
thu_tu_mac_dinh = &quot;{}, {} và {}&quot;.format(&#039;Quản&#039;,&#039;Trị&#039;,&#039;Mạng&#039;)
print(&#039;\n--- Thứ tự mặc định ---&#039;)
print(thu_tu_mac_dinh)

# sử dụng đối số vị trí để sắp xếp thứ tự
vi_tri_thu_tu= &quot;{1}, {0} và {2}&quot;.format(&#039;Quản&#039;,&#039;Trị&#039;,&#039;Mạng&#039;)
print(&#039;\n--- Thứ tự theo vị trí ---&#039;)
print(vi_tri_thu_tu)

# sử dụng từ khóa để sắp xếp thứ tự
tu_khoa_thu_tu = &quot;{s}, {b} và {j}&quot;.format(j=&#039;Quản&#039;,b=&#039;Trị&#039;,s=&#039;Mạng&#039;)
print(&#039;\n--- Thứ tự theo từ khóa ---&#039;)
print(tu_khoa_thu_tu)</pre>

<p style="text-align: justify;">Ta có kết quả khi chạy code trên như sau:</p>

<pre id="pre51" style="text-align: justify;">
--- Thứ tự mặc định ---
Quản, Trị và Mạng

--- Thứ tự theo vị trí ---
Trị, Quản và Mạng

--- Thứ tự theo từ khóa ---
Mạng, Trị và Quản</pre>

<p style="text-align: justify;">Phương thức format() có thể có những đặc tả định dạng tùy chọn. Chúng được tách khỏi tên trường bằng dấu :. Ví dụ, có thể căn trái &lt;, căn phải &gt; hoặc căn giữa ^ một chuỗi trong không gian đã cho. Có thể định dạng số nguyên như số nhị phân, thập lục phân; số thập phân có thể được làm tròn hoặc hiển thị dưới dạng số mũ. Có rất nhiều định dạng bạn có thể sử dụng.</p>

<pre id="pre52" style="text-align: justify;">
&gt;&gt;&gt; # Định dạng số nguyên
&gt;&gt;&gt; &quot;Khi chuyển {0} sang nhị phân sẽ là {0:b}&quot;.format(12)
&#039;Khi chuyển 12 sang nhị phân sẽ là 1100&#039;

&gt;&gt;&gt; # Định dạng số thập phân
&gt;&gt;&gt; &quot;Số thập phân {0} ở dạng mũ sẽ là {0:e}&quot;.format(1566.345)
&#039;Số thập phân 1566.345 ở dạng mũ sẽ là 1.566345e+03&#039;

&gt;&gt;&gt; # Làm tròn số thập phân
&gt;&gt;&gt; &quot;1 phần 3 là: {0:.3f}&quot;.format(1/3)
&#039;1 phần 3 là: 0.333&#039;

&gt;&gt;&gt; # căn chỉnh chuỗi
&gt;&gt;&gt; &quot;|{:&lt;10}|{:^10}|{:&gt;10}|&quot;.format(&#039;Quản&#039;,&#039;Trị&#039;,&#039;Mạng&#039;)
&#039;|Quản | Trị | Mạng|&#039;</pre>

<p style="text-align: justify;"><strong>Định dạng chuỗi kiểu cũ:</strong></p>

<p style="text-align: justify;">Bạn có thể định dạng chuỗi trong Python về phong cách sprintf() được sử dụng trong&nbsp;ngôn ngữ lập trình C&nbsp;bằng toán tử %.</p>

<pre id="pre53" style="text-align: justify;">
&gt;&gt;&gt; x = 15.1236789
&gt;&gt;&gt; print(&#039;Giá trị của x là %3.2f&#039; %x)
Giá trị của x là 15.12
&gt;&gt;&gt; print(&#039;Giá trị của x là %3.4f&#039; %x)
Giá trị của x là 15.123712.3457</pre>

<h3 id="mcetoc_1ckbn8jek7" style="text-align: justify;">Phương thức thường được sử dụng trong string</h3>

<p style="text-align: justify;">Có rất nhiều phương thức được tích hợp sẵn trong Python để làm việc với string. Ngoài format() được đề cập bên trên còn có lower(), upper(), join(), split(), find(), replace(), v.v....</p>

<pre id="pre54" style="text-align: justify;">
&gt;&gt;&gt; &quot;QuanTriMang.Com&quot;.lower()
&#039;quantrimang.com&#039;
&gt;&gt;&gt; &quot;QuanTriMang.Com&quot;.upper()
&#039;QUANTRIMANG.COM&#039;
&gt;&gt;&gt; &quot;Quan Tri Mang Chấm Com&quot;.split()
&#91;&#039;Quan&#039;, &#039;Tri&#039;, &#039;Mang&#039;, &#039;Chấm&#039;, &#039;Com&#039;&#93;
&gt;&gt;&gt; &#039; &#039;.join(&#91;&#039;Quan&#039;, &#039;Tri&#039;, &#039;Mang&#039;, &#039;Chấm&#039;, &#039;Com&#039;&#93;)
&#039;Quan Tri Mang Chấm Com&#039;&#039;
&gt;&gt;&gt; &#039;Quan Tri Mang Chấm Com&#039;.find(&#039;Qua&#039;)
0
&gt;&gt;&gt; &#039;Quan Tri Mang Chấm Com&#039;.replace(&#039;Chấm&#039;,&#039;.&#039;)
&#039;Quan Tri Mang . Com&#039;</pre>

<h2 id="mcetoc_1bs0pu9a20" style="text-align: justify;">4. Danh sách (list)</h2>

<p style="text-align: justify;">Python cung cấp một loạt các dữ liệu phức hợp, thường được gọi là các chuỗi (sequence), sử dụng để nhóm các giá trị khác nhau. Đa năng nhất là danh sách (list).</p>

<h3 id="mcetoc_1cigfnr5h0" style="text-align: justify;">Cách tạo list trong Python</h3>

<p style="text-align: justify;">Trong Python, list được biểu diễn bằng dãy các giá trị, được phân tách nhau bằng dấu phẩy, nằm trong dấu &#91;&#93;. Các danh sách có thể chứa nhiều mục với kiểu khác nhau, nhưng thông thường là các mục có cùng kiểu.</p>

<pre id="pre55" style="text-align: justify;">
&gt;&gt;&gt; squares = &#91;1, 4, 9, 16, 25&#93;
&gt;&gt;&gt; squares
&#91;1, 4, 9, 16, 25&#93;</pre>

<p style="text-align: justify;">List không giới hạn số lượng mục, bạn có thể có nhiều kiểu dữ liệu khác nhau trong cùng một list, như chuỗi, số nguyên, số thập phân,...</p>

<pre id="pre56" style="text-align: justify;">
list1 = &#91;&#93; # list rỗng
list2 = &#91;1, 2, 3&#93; # list số nguyên
list3 = &#91;1, &quot;Hello&quot;, 3.4&#93; # list với kiểu dữ liệu hỗn hợp</pre>

<p style="text-align: justify;">Bạn cũng có thể tạo các list lồng nhau (danh sách chứa trong danh sách), ví dụ:</p>

<pre id="pre57" style="text-align: justify;">
a = &#91;&#039;a&#039;, &#039;b&#039;, &#039;c&#039;&#93;
n = &#91;1, 2, 3&#93;
x = &#91;a, n&#93;

print (x) # Output: &#91;&#91;&#039;a&#039;, &#039;b&#039;, &#039;c&#039;&#93;, &#91;1, 2, 3&#93;&#93;
print (x&#91;0&#93;) # Output: &#91;&#039;a&#039;, &#039;b&#039;, &#039;c&#039;&#93;
print(x&#91;0&#93;&#91;1&#93;) # Output: b</pre>

<p style="text-align: justify;">Hoặc khai báo list lồng nhau từ đầu:</p>

<pre id="pre58" style="text-align: justify;">
list4 = &#91;mouse&quot;, &#91;8, 4, 6&#93;, &#91;&#039;a&#039;&#93;&#93;</pre>

<h3 id="mcetoc_1cigfputp2" style="text-align: justify;">Truy cập vào phần tử của list</h3>

<p style="text-align: justify;">Có nhiều cách khác nhau để truy cập vào phần tử của một danh sách:</p>

<p style="text-align: justify;"><strong>Index (chỉ mục) của list:</strong></p>

<p style="text-align: justify;">Sử dụng toán tử index &#91;&#93; để truy cập vào một phần tử của list. Index bắt đầu từ 0, nên một list có 5 phần tử sẽ có index từ 0 đến 4. Truy cập vào phần tử có index khác index của list sẽ làm phát sinh lỗi IndexError. Index phải là một số nguyên, không thể sử dụng float, hay kiểu dữ liệu khác, sẽ tạo lỗi TypeError.</p>

<pre id="pre59" style="text-align: justify;">
qtm_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# TypeError: list indices must be integers or slices, not float
# TypeError: index của list phải là số nguyên hoặc slice, không phải số thập phân
qtm_list&#91;2.0&#93;</pre>

<p style="text-align: justify;">List lồng nhau có thể truy cập bằng index lồng nhau:</p>

<pre id="pre60" style="text-align: justify;">
qtm_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;
# Output: q
print(qtm_list&#91;0&#93;)

# Output: a
print(qtm_list&#91;2&#93;)

# Output: t
print(qtm_list&#91;4&#93;)

# List lồng nhau
ln_list = &#91;&quot;Happy&quot;, &#91;1,3,5,9&#93;&#93;

# Index lồng nhau

# Output: a
print(ln_list&#91;0&#93;&#91;1&#93;)

# Output: 9
print(ln_list&#91;1&#93;&#91;3&#93;)</pre>

<p style="text-align: justify;"><strong>Index âm:</strong></p>

<p style="text-align: justify;">Python cho phép lập chỉ mục âm cho các chuỗi. Index -1 là phần tử cuối cùng, -2 là phần tử thứ 2 từ cuối cùng lên. Nói đơn giản là index âm dùng khi bạn đếm phần tử của chuỗi ngược từ cuối lên đầu.</p>

<pre id="pre61" style="text-align: justify;">
qtm_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# Code by Quantrimang.com
# Output: m
print(qtm_list&#91;-1&#93;)
# Output: i
print(qtm_list&#91;-9&#93;)</pre>

<h3 id="mcetoc_1cigfpfa51" style="text-align: justify;">Cắt lát (slice) list trong Python</h3>

<p style="text-align: justify;">Python cho phép truy cập vào một dải phần tử của list bằng cách sử dụng toán tử cắt lát : (dấu hai chấm). Mọi hành động cắt list đều trả về list mới chứa những yếu tố được yêu cầu.</p>

<pre id="pre62" style="text-align: justify;">
qtm_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;
# Code by Quantrimang.com
# Output: &#91;&#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;&#93;
print(qtm_list&#91;1:5&#93;)
# Output: &#91;&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;&#93;
print(qtm_list&#91;:-8&#93;)
# Output: &#91;&#039;n&#039;, &#039;g&#039;, &#039;.&#039;, &#039;c&#039;, &#039;o&#039;, &#039;m&#039;&#93;
print(qtm_list&#91;9:&#93;)</pre>

<p style="text-align: justify;">Để cắt lát list, bạn chỉ cần sử dụng dấu : giữa 2 index cần lấy các phần tử. &#91;1:5&#93; sẽ lấy phần tử 1 đến 5, &#91;:-8&#93; lấy từ 0 đến phần tử -8,...</p>

<p style="text-align: justify;">Nếu thực hiện hành động cắt sau thì nó sẽ trả về một list mới là bản sao của list ban đầu:</p>

<pre id="pre63" style="text-align: justify;">
qtm_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# Output: &#91;&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;, &#039;.&#039;, &#039;c&#039;, &#039;o&#039;, &#039;m&#039;&#93;
print(qtm_list&#91;:&#93;)</pre>

<h3 id="mcetoc_1ck9p3qka0" style="text-align: justify;">Thay đổi hoặc thêm phần tử vào list</h3>

<p style="text-align: justify;">List cũng hỗ trợ các hoạt động như nối list:</p>

<pre id="pre64" style="text-align: justify;">
&gt;&gt;&gt; squares + &#91;36, 49, 64, 81, 100&#93;
&#91;1, 4, 9, 16, 25, 36, 49, 64, 81, 100&#93;</pre>

<p style="text-align: justify;">Không giống như chuỗi, bị gán cố định, list là kiểu dữ liệu có thể thay đổi. Ví dụ, bạn có thể thay đổi các mục trong list:</p>

<pre id="pre65" style="text-align: justify;">
&gt;&gt;&gt; cubes = &#91;1, 8, 27, 65, 125&#93; # có vẻ sai sai
&gt;&gt;&gt; 4 ** 3 # lập phương của 4 là 64, không phải 65!
64
&gt;&gt;&gt; cubes&#91;3&#93; = 64 # thay thế giá trị sai
&gt;&gt;&gt; cubes
&#91;1, 8, 27, 64, 125&#93;</pre>

<p style="text-align: justify;">Bạn cũng có thể cho thêm mục mới vào cuối list bằng cách sử dụng các phương thức, chẳng hạn như append():</p>

<pre id="pre66" style="text-align: justify;">
&gt;&gt;&gt; cubes.append(216) # thêm lập phương của 6
&gt;&gt;&gt; cubes.append(7 ** 3) # và lập phương của 7
&gt;&gt;&gt; cubes
&#91;1, 8, 27, 64, 125, 216, 343&#93;</pre>

<p style="text-align: justify;">Việc gán cho lát cũng có thể thực hiện và thậm chí có thể thay đổi cả kích thước của list hay xóa nó hoàn toàn:</p>

<pre id="pre67" style="text-align: justify;">
&gt;&gt;&gt; letters = &#91;&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;, &#039;e&#039;, &#039;f&#039;, &#039;g&#039;&#93;
&gt;&gt;&gt; letters
&#91;&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;, &#039;e&#039;, &#039;f&#039;, &#039;g&#039;&#93;
&gt;&gt;&gt; # thay thế vài giá trị
&gt;&gt;&gt; letters&#91;2:5&#93; = &#91;&#039;C&#039;, &#039;D&#039;, &#039;E&#039;&#93;
&gt;&gt;&gt; letters
&#91;&#039;a&#039;, &#039;b&#039;, &#039;C&#039;, &#039;D&#039;, &#039;E&#039;, &#039;f&#039;, &#039;g&#039;&#93;
&gt;&gt;&gt; # giờ thì xóa chúng
&gt;&gt;&gt; letters&#91;2:5&#93; = &#91;&#93;
&gt;&gt;&gt; letters
&#91;&#039;a&#039;, &#039;b&#039;, &#039;f&#039;, &#039;g&#039;&#93;
&gt;&gt;&gt; # xóa list bằng cách thay tất cả các phần tử bằng một list rỗng
&gt;&gt;&gt; letters&#91;:&#93; = &#91;&#93;
&gt;&gt;&gt; letters
&#91;&#93;</pre>

<p style="text-align: justify;">Hàm len() cũng có thể áp dụng với list:</p>

<pre id="pre68" style="text-align: justify;">
&gt;&gt;&gt; letters = &#91;&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;&#93;
&gt;&gt;&gt; len(letters)
4</pre>

<h3 id="mcetoc_1ck9p3qka1" style="text-align: justify;">Xóa hoặc loại bỏ phần tử khỏi list trong Python</h3>

<p style="text-align: justify;">Bạn có thể xóa một hoặc nhiều phần tử khỏi list sử dụng từ khóa del, có thể xóa hoàn toàn cả list.</p>

<pre id="pre69" style="text-align: justify;">
my_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# xóa phần tử có index là 2
del my_list&#91;2&#93;

# Output: &#91;&#039;q&#039;, &#039;u&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;, &#039;.&#039;, &#039;c&#039;, &#039;o&#039;, &#039;m&#039;&#93; 
print(my_list)

# xóa phần tử có index từ 1 đến 7
del my_list&#91;1:7&#93;

# Output: &#91;&#039;q&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;, &#039;.&#039;, &#039;c&#039;, &#039;o&#039;, &#039;m&#039;&#93;
print(my_list)

# xóa toàn bộ list my_list
del my_list

# Error: NameError: name &#039;my_list&#039; is not defined
print(my_list)</pre>

<p style="text-align: justify;">Bạn cũng có thể sử dụng remove() để loại bỏ những phần tử đã cho hoặc pop() để loại bỏ phần tử tại một index nhất định. pop() loại bỏ phần tử và trả về phần tử cuối cùng nếu index không được chỉ định. Điều này giúp triển khai list dưới dạng stack (ngăn xếp) (cấu trúc dữ liệu first in last out - vào đầu tiên, ra cuối cùng).</p>

<p style="text-align: justify;">Ngoài ra, phương thức clear() cũng được dùng để làm rỗng một list (xóa tất cả các phần tử trong list).</p>

<pre id="pre70" style="text-align: justify;">
my_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;
my_list.remove(&#039;.&#039;)

# Output: &#91;&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;, &#039;c&#039;, &#039;o&#039;, &#039;m&#039;&#93; 
print(my_list)

# Output: n
print(my_list.pop(3))

# Output: &#91;&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;, &#039;c&#039;, &#039;o&#039;, &#039;m&#039;&#93;
print(my_list)

# Output: m
print(my_list.pop())

# Output: &#91;&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;, &#039;c&#039;, &#039;o&#039;&#93;
print(my_list)

my_list.clear()

# Output: &#91;&#93; (list rỗng)
print(my_list)</pre>

<p style="text-align: justify;">Cách cuối cùng để xóa các phần tử trong một list là gán một list rỗng cho các lát phần tử.</p>

<pre id="pre71" style="text-align: justify;">
&gt;&gt;&gt; my_list = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;
&gt;&gt;&gt; my_list&#91;11:15&#93;=&#91;&#93;
&gt;&gt;&gt; my_list
&#91;&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;&#93;</pre>

<h3 id="mcetoc_1ck9p3qka2" style="text-align: justify;">Phương thức list trong Python</h3>

<p style="text-align: justify;">Những phương thức có sẵn cho list trong Python gồm:</p>

<ul>
	<li style="text-align: justify;"><strong>append()</strong>: Thêm phần tử vào cuối list.</li>
	<li style="text-align: justify;"><strong>extend()</strong>: Thêm tất cả phần tử của list hiện tại vào list khác.</li>
	<li style="text-align: justify;"><strong>insert()</strong>: Chèn một phần tử vào index cho trước.</li>
	<li style="text-align: justify;"><strong>remove()</strong>: Xóa phần tử khỏi list.</li>
	<li style="text-align: justify;"><strong>pop()</strong>: Xóa phần tử khỏi list và trả về phần tử tại index đã cho.</li>
	<li style="text-align: justify;"><strong>clear()</strong>: Xóa tất cả phần tử của list.</li>
	<li style="text-align: justify;"><strong>index()</strong>: Trả về index của phần tử phù hợp đầu tiên.</li>
	<li style="text-align: justify;"><strong>count()</strong>: Trả về số lượng phần tử đã đếm được trong list như một đối số.</li>
	<li style="text-align: justify;"><strong>sort()</strong>: Sắp xếp các phần tử trong list theo thứ tự tăng dần.</li>
	<li style="text-align: justify;"><strong>reverse()</strong>: Đảo ngược thứ tự các phần tử trong list.</li>
	<li style="text-align: justify;"><strong>copy()</strong>: Trả về bản sao của list.</li>
</ul>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre72" style="text-align: justify;">
QTM = &#91;9,8,7,6,8,5,8&#93;

# Output: 2
print(QTM.index(7))

# Output: 3
print(QTM.count(8))

QTM.sort()

# Output: &#91;5, 6, 7, 8, 8, 8, 9&#93;
print(QTM)

QTM.reverse()

# Output: &#91;9, 8, 8, 8, 7, 6, 5&#93;
print(QTM)</pre>

<p style="text-align: justify;">Ví dụ 2:</p>

<pre id="pre73" style="text-align: justify;">
QTM = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# Output: 3
print(QTM.index(&#039;n&#039;))

# Output: 2
print(QTM.count(&#039;a&#039;))

QTM.sort()

# Output: &#91;&#039;.&#039;, &#039;a&#039;, &#039;a&#039;, &#039;c&#039;, &#039;g&#039;, &#039;i&#039;, &#039;m&#039;, &#039;m&#039;, &#039;n&#039;, &#039;n&#039;, &#039;o&#039;, &#039;q&#039;, &#039;r&#039;, &#039;t&#039;, &#039;u&#039;&#93;
print(QTM)

QTM.reverse()

# Output: &#91;&#039;u&#039;, &#039;t&#039;, &#039;r&#039;, &#039;q&#039;, &#039;o&#039;, &#039;n&#039;, &#039;n&#039;, &#039;m&#039;, &#039;m&#039;, &#039;i&#039;, &#039;g&#039;, &#039;c&#039;, &#039;a&#039;, &#039;a&#039;, &#039;.&#039;&#93;
print(QTM)</pre>

<h3 id="mcetoc_1ck9p3qka3" style="text-align: justify;">List comprehension: Cách tạo list mới ngắn gọn</h3>

<p style="text-align: justify;">List comprehension là một biểu thức đi kèm với&nbsp;<a href="https://quantrimang.com/hoc/vong-lap-for-trong-python-142234" title="Vòng lặp for trong Python">lệnh for</a>&nbsp;được đặt trong cặp dấu ngoặc vuông &#91;&#93;.</p>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre74" style="text-align: justify;">
cub3 = &#91;3 ** x for x in range(9)&#93;

# Output: &#91;1, 3, 9, 27, 81, 243, 729, 2187, 6561&#93;
print(cub3)</pre>

<p style="text-align: justify;">Code trên tương đương với:</p>

<pre id="pre75" style="text-align: justify;">
cub3 = &#91;&#93;
for x in range (9):
cub3.append(3**x)
print(cub3)</pre>

<p style="text-align: justify;">Ngoài for, if cũng có thể được sử dụng trong một&nbsp;<a href="https://quantrimang.com/hoc/cach-su-dung-list-comprehension-trong-python-154301" title="Cách sử dụng List comprehension trong Python">list comprehension của Python</a>. Lệnh if có thể lọc các phần tử trong list hiện tại để tạo thành list mới. Dưới đây là ví dụ:</p>

<pre id="pre76" style="text-align: justify;">
cub3 = &#91;3 ** x for x in range(9) if x &gt; 4&#93;

# Output: &#91;243, 729, 2187, 6561&#93;
print(cub3)

so_le = &#91;x for x in range (18) if x % 2 == 1&#93;

# Output: &#91;1, 3, 5, 7, 9, 11, 13, 15, 17&#93;
print(so_le)

noi_list = &#91;x+y for x in &#91;&#039;Ngôn ngữ &#039;,&#039;Lập trình &#039;&#93; for y in &#91;&#039;Python&#039;,&#039;C++&#039;&#93;&#93;

# Output: &#91;&#039;Ngôn ngữ Python&#039;, &#039;Ngôn ngữ C++&#039;, &#039;Lập trình Python&#039;, &#039;Lập trình C++&#039;&#93;
print(noi_list)</pre>

<h3 id="mcetoc_1ck9psbjs4" style="text-align: justify;">Kiểm tra phần tử có trong list không</h3>

<p style="text-align: justify;">Sử dụng keyword in để kiểm tra xem một phần tử đã có trong list hay chưa. Nếu phần tử đã tồn tại, kết quả trả về là True, và ngược lại sẽ trả về False.</p>

<pre id="pre77" style="text-align: justify;">
QTM = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# Output: True
print(&#039;q&#039; in QTM)

# Output: True
print(&#039;.&#039; in QTM)

# Output: False
print(&#039;z&#039; in QTM)</pre>

<h3 id="mcetoc_1ck9q1m2k5" style="text-align: justify;">Vòng lặp for trong list</h3>

<p style="text-align: justify;">Sử dụng vòng lặp for để lặp qua các phần tử trong list như ví dụ dưới đây:</p>

<pre id="pre78" style="text-align: justify;">
for ngon_ngu in &#91;&#039;Python&#039;,&#039;Java&#039;,&#039;C&#039;&#93;:
print(&quot;Tôi thích lập trình&quot;,ngon_ngu)</pre>

<p style="text-align: justify;">Kết quả trả về sẽ như sau:</p>

<pre id="pre79" style="text-align: justify;">
Tôi thích lập trình Python
Tôi thích lập trình Java
Tôi thích lập trình C</pre>

<h3 id="mcetoc_1ck9q5rhj6" style="text-align: justify;">Các hàm Python tích hợp với list</h3>

<p style="text-align: justify;">Các&nbsp;<a href="https://quantrimang.com/hoc/cac-ham-python-tich-hop-san-143779" title="Các hàm Python tích hợp sẵn">hàm Python tích hợp sẵn</a>&nbsp;như&nbsp;<a href="https://quantrimang.com/cong-nghe/ham-all-trong-python-144898" title="Hàm all() trong Python">all()</a>,&nbsp;<a href="https://quantrimang.com/cong-nghe/ham-any-trong-python-144865" title="Hàm any() trong Python">any()</a>, enumerate(), len(), max(), min(), list(), sorted(),... thường được sử dụng với list để thực hiện những nhiệm vụ khác nhau.</p>

<ul>
	<li style="text-align: justify;"><strong>all()</strong>: Trả về giá trị True nếu tất cả các phần tử của list đều là true hoặc list rỗng.</li>
	<li style="text-align: justify;"><strong>any()</strong>: Trả về True khi bất kỳ phần tử nào trong list là true. Nếu list rỗng hàm trả về giá trị False.</li>
	<li style="text-align: justify;"><strong>enumerate()</strong>: Trả về đối tượng enumerate, chứa index và giá trị của tất cả các phần tử của list dưới dạng tuple.</li>
	<li style="text-align: justify;"><strong>len()</strong>: Trả về độ dài (số lượng phần tử) của list.</li>
	<li style="text-align: justify;"><strong>list()</strong>: Chuyển đổi một đối tượng có thể lặp (tuple, string, set, dictionary) thành list.</li>
	<li style="text-align: justify;"><strong>max()</strong>: Trả về phần tử lớn nhất trong list.</li>
	<li style="text-align: justify;"><strong>min()</strong>: Trả về phần tử nhỏ nhất trong list.</li>
	<li style="text-align: justify;"><strong>sorted()</strong>: Trả về list mới đã được sắp xếp.</li>
	<li style="text-align: justify;"><strong>sum()</strong>: Trả về tổng của tất cả các phần tử trong list.</li>
</ul>

<h2 id="mcetoc_1bth5hjlu0" style="text-align: justify;">5. Tuple</h2>

<p style="text-align: justify;">Tuple trong Python là một chuỗi các phần tử có thứ tự giống như list. Sự khác biệt giữa list và tuple là chúng ta không thể thay đổi các phần tử trong tuple khi đã gán, nhưng trong list thì các phần tử có thể thay đổi.</p>

<p style="text-align: justify;">Tuple thường được sử dụng cho các dữ liệu không cho phép sửa đổi và nhanh hơn list vì nó không thể thay đổi tự động. Một tuple được định nghĩa bằng dấu ngoặc đơn (), các phần tử trong tuple cách nhau bằng dấu phẩy (,).</p>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre80" style="text-align: justify;">
t = (10, &quot;quan tri mang&quot;, 2j)</pre>

<p style="text-align: justify;">Bạn có thể sử dụng toán tử cắt &#91;&#93; để trích xuất phần tử trong tuple nhưng không thể thay đổi giá trị của nó.</p>

<pre id="pre81" style="text-align: justify;">
t = (10, &quot;quan tri mang&quot;, 2j)
#t&#91;0:2&#93; = (10, &#039;quan tri mang&#039;)
print(&quot;t&#91;0:2&#93; = &quot;, t&#91;0:2&#93;)</pre>

<p style="text-align: justify;">Chạy code trên ta được kết quả:</p>

<pre id="pre82" style="text-align: justify;">
t&#91;0:2&#93; = (10, &#039;quan tri mang&#039;)</pre>

<h3 id="mcetoc_1ck9tof5c0" style="text-align: justify;">Tuple hơn list ở điểm nào?</h3>

<p style="text-align: justify;">Vì tuple và list khá giống nhau, nên chúng thường được sử dụng trong những tình huống tương tự nhau. Tuy nhiên, tuple vẫn có những lợi thế nhất định so với list, như:</p>

<ul>
	<li style="text-align: justify;">Tuple thường được sử dụng cho các kiểu dữ liệu không đồng nhất (khác nhau) và list thường sử dụng cho các kiểu dữ liệu (đồng nhất) giống nhau.</li>
	<li style="text-align: justify;">Vì tuple không thể thay đổi, việc lặp qua các phần tử của tuple nhanh hơn so với list. Vì vậy, trong trường hợp này tuple chiếm ưu thế về hiệu suất hơn list một chút.</li>
	<li style="text-align: justify;">Tuple chứa những phần tử không thay đổi, có thể được sử dụng như key cho dictionary. Với list, điều này không thể làm được.</li>
	<li style="text-align: justify;">Nếu có dữ liệu không thay đổi việc triển khai nó như một tuple sẽ đảm bảo rằng dữ liệu đó được bảo vệ chống ghi (write-protected).</li>
</ul>

<h3 id="mcetoc_1ck9tof5c1" style="text-align: justify;">Tạo một tuple</h3>

<p style="text-align: justify;">Tuple được tạo bằng cách đặt tất cả các phần tử của nó trong dấu ngoặc đơn (), phân tách bằng dấu phẩy. Bạn có thể bỏ dấu ngoặc đơn nếu muốn, nhưng nên thêm nó vào cho code rõ ràng hơn.</p>

<p style="text-align: justify;">Tuple không bị giới hạn số lượng phần tử và có thể có nhiều kiểu dữ liệu khác nhau như số nguyên, số thập phân, list, string,...</p>

<pre id="pre83" style="text-align: justify;">
# Tuple rỗng
# Output: ()
my_tuple = ()
print(my_tuple)

# tuple số nguyên
# Output: (2, 4, 16, 256)
my_tuple = (2, 4, 16, 256)
print(my_tuple)

# tuple có nhiều kiểu dữ liệu
# Output: (10, &quot;Quantrimang.com&quot;, 3.5)
my_tuple = (10, &quot;Quantrimang.com&quot;, 3.5)
print(my_tuple)

# tuple lồng nhau
# Output: (&quot;QTM&quot;, &#91;2, 4, 6&#93;, (3, 5, 7))
my_tuple = (&quot;QTM&quot;, &#91;2, 4, 6&#93;, (3, 5, 7))
print(my_tuple)

# tuple có thể được tạo mà không cần dấu ()
# còn gọi là đóng gói tuple
# Output: (10, &quot;Quantrimang.com&quot;, 3.5)

my_tuple = 10, &quot;Quantrimang.com&quot;, 3.5
print(my_tuple)

# mở gói (unpacking) tuple cũng có thể làm được
# Output:
# 10
# Quantrimang.com
# 3.5
a, b, c = my_tuple
print(a)
print(b)
print(c) </pre>

<p style="text-align: justify;">Tạo tuple chỉ có một phần tử hơi phức tạp chút, nếu bạn tạo theo cách thông thường là cho phần tử đó vào trong cặp dấu () là chưa đủ, cần phải thêm dấu phẩy để chỉ ra rằng, đây là tuple.</p>

<pre id="pre84" style="text-align: justify;">
# tạo tuple chỉ với ()
# Output: &lt;class &#039;str&#039;&gt;
my_tuple = (&quot;Quantrimang.com&quot;)
print(type(my_tuple))

# khi thêm dấu phẩy vào cuối
# Output: &lt;class &#039;tuple&#039;&gt;
my_tuple = (&quot;Quantrimang.com&quot;,) 
print(type(my_tuple))

# dấu () là tùy chọn, bạn có thể bỏ nếu thích
# Output: &lt;class &#039;tuple&#039;&gt;
my_tuple = &quot;Quantrimang.com&quot;,
print(type(my_tuple))</pre>

<h3 id="mcetoc_1ck9tof5c2" style="text-align: justify;">Truy cập vào các phần tử của tuple</h3>

<p style="text-align: justify;">Có nhiều cách khác nhau để truy cập vào các phần tử của một tuple, khá giống với list, nên mình không lấy ví dụ cụ thể, các bạn có thể xem lại phần list nha.</p>

<p style="text-align: justify;"><strong>Index:&nbsp;</strong>Sử dụng toán tử index &#91;&#93; để truy cập vào phần tử trong tuple với index bắt đầu bằng 0. Nghĩa là nếu tuple có 6 phần tử thì index của nó sẽ bắt đầu từ 0 đến 5. Nếu cố gắn truy cập đến index 6, 7 thì sẽ tạo lỗi IndexError. Index bắt buộc phải là số nguyên, mà không thể là số thập phân hay bất kỳ kiểu dữ liệu nào khác, nếu không sẽ tạo lỗi TypeError. Những tuple lồng nhau được truy cập bằng cách sử dụng index lồng nhau:</p>

<pre id="pre85" style="text-align: justify;">
# tuple lồng nhau
n_tuple = (&quot;Quantrimang.com&quot;, &#91;2, 6, 8&#93;, (1, 2, 3))

# index lồng nhau
# Output: &#039;r&#039;
print(n_tuple&#91;0&#93;&#91;5&#93;)

# index lồng nhau
# Output: 8
print(n_tuple&#91;1&#93;&#91;2&#93;)</pre>

<p style="text-align: justify;"><strong>Index âm:&nbsp;</strong>Python cho phép lập chỉ mục âm cho các đối tượng dạng chuỗi. Index -1 tham chiếu đến phần tử cuối cùng, -2 là thứ 2 tính từ cuối tính lên.</p>

<p style="text-align: justify;"><strong>Cắt lát:</strong>&nbsp;Có thể truy cập đến một loạt phần tử trong tuple bằng cách sử dụng toán tử cắt lát : (dấu 2 chấm).</p>

<h3 id="mcetoc_1ck9tof5c3" style="text-align: justify;">Thay đổi một tuple</h3>

<p style="text-align: justify;">Không giống như list, tuple không thể thay đổi. Điều này có nghĩa là các phần tử của một tuple không thể thay đổi một khi đã được gán. Nhưng, nếu bản thân phần tử đó là một kiểu dữ liệu có thể thay đổi (như list chẳng hạn) thì các phần tử lồng nhau có thể được thay đổi. Chúng ta cũng có thể gán giá trị khác cho tuple (gọi là gán lại - reassignment).</p>

<pre id="pre86" style="text-align: justify;">
my_tuple = (1, 3, 5, &#91;7, 9&#93;)

# không thể thay đổi phần tử của tuple
# Nếu bạn bỏ dấu # ở dòng 8
# Bạn sẽ nhận được lỗi:
# TypeError: &#039;tuple&#039; object does not support item assignment

#my_tuple&#91;1&#93; = 9

# Nhưng phần tử có index 3 trong tuple là list
# list có thể thay đổi, nên phần tử đó có thể thay đổi
# Output: (1, 3, 5, &#91;8, 9&#93;)
my_tuple&#91;3&#93;&#91;0&#93; = 8
print(my_tuple)

# Nếu cần thay đổi tuple hãy gán lại giá trị cho nó
# Output: (&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;)
my_tuple = (&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;)
print(my_tuple)</pre>

<p style="text-align: justify;">Bạn có thể dùng toán tử + để nối 2 tuple, toán tử * để lặp lại tuple theo số lần đã cho. Cả + và * đều cho kết quả là một tuple mới.</p>

<pre id="pre87" style="text-align: justify;">
# Nối 2 tuple
# Output: (2, 4, 6, 3, 5, 7)
print((2, 4, 6) + (3, 5, 7))

# Lặp lại tuple
# Output: (&#039;Quantrimang.com&#039;, &#039;Quantrimang.com&#039;, &#039;Quantrimang.com&#039;)
print((&quot;Quantrimang.com&quot;,) * 3)</pre>

<h3 id="mcetoc_1ckbiu1pk0" style="text-align: justify;">Xóa tuple</h3>

<p style="text-align: justify;">Các phần tử trong tuple không thể thay đổi nên chúng ta cũng không thể xóa, loại bỏ phần tử khỏi tuple. Nhưng việc xóa hoàn toàn một tuple có thể thực hiện được với từ khóa del như dưới đây:</p>

<pre id="pre88" style="text-align: justify;">
QTM = (&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;)

# Không thể xóa phần tử của tuple
# Nếu bạn chạy lệnh del QTM&#91;3&#93;
# sẽ tạo ra lỗi:
# TypeError: &#039;tuple&#039; object doesn&#039;t support item deletion

# Có thể xóa toàn bộ tuple
del QTM
# Sau đó thử chạy print (QTM) sẽ trả về lỗi
# NameError: name &#039;QTM&#039; is not defined

</pre>

<h3 id="mcetoc_1ckbiu1pk1" style="text-align: justify;">Phương thức và hàm dùng với tuple trong Python</h3>

<p style="text-align: justify;">Phương thức thêm phần tử và xóa phần tử không thể sử dụng với tuple, chỉ có 2 phương thức sau là dùng được:</p>

<ul>
	<li style="text-align: justify;"><strong>count(x)</strong>: Đếm số phần tử x trong tuple.</li>
	<li style="text-align: justify;"><strong>index(x)</strong>: Trả về giá trị index của phần tử x đầu tiên mà nó gặp trong tuple.</li>
</ul>

<pre id="pre89" style="text-align: justify;">
QTM = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# Count
# Output: 2
print(QTM.count(&#039;m&#039;))

# Index
# Output: 3
print(QTM.index(&#039;n&#039;))</pre>

<p style="text-align: justify;">Các hàm dùng trong tuple khá giống với list, gồm có:</p>

<ul>
	<li style="text-align: justify;"><strong>all()</strong>: Trả về giá trị True nếu tất cả các phần tử của tuple là true hoặc tuple rỗng.</li>
	<li style="text-align: justify;"><strong>any()</strong>: Trả về True nếu bất kỳ phần tử nào của tuple là true, nếu tuple rỗng trả về False.</li>
	<li style="text-align: justify;"><strong>enumerated()</strong>: Trả về đối tượng enumerate (liệt kê), chứa cặp index và giá trị của tất cả phần tử của tuple.</li>
	<li style="text-align: justify;"><strong>len()</strong>: Trả về độ dài (số phần tử) của tuple.</li>
	<li style="text-align: justify;"><strong>max()</strong>: Trả về phần tử lớn nhất của tuple.</li>
	<li style="text-align: justify;"><strong>min()</strong>: Trả về phần tử nhỏ nhất của tuple.</li>
	<li style="text-align: justify;"><strong>sorted()</strong>: Lấy phần tử trong tuple và trả về list mới được sắp xếp (tuple không sắp xếp được).</li>
	<li style="text-align: justify;"><strong>sum()</strong>: Trả về tổng tất cả các phần tử trong tuple.</li>
	<li style="text-align: justify;"><strong>tuple()</strong>: Chuyển đổi những đối tượng có thể lặp (list, string, set, dictionary) thành tuple.</li>
</ul>

<h3 id="mcetoc_1ckbiu1pk2" style="text-align: justify;">Kiểm tra phần tử trong tuple</h3>

<p style="text-align: justify;">Bạn có thể kiểm tra xem một phần tử đã tồn tại trong tuple hay chưa với từ khóa in.</p>

<pre id="pre90" style="text-align: justify;">
QTM = &#91;&#039;q&#039;,&#039;u&#039;,&#039;a&#039;,&#039;n&#039;,&#039;t&#039;,&#039;r&#039;,&#039;i&#039;,&#039;m&#039;,&#039;a&#039;,&#039;n&#039;,&#039;g&#039;,&#039;.&#039;,&#039;c&#039;,&#039;o&#039;,&#039;m&#039;&#93;

# Kiểm tra phần tử
# Output: True
print(&#039;a&#039; in QTM)

# Output: False
print(&#039;b&#039; in QTM)

# Not in operation
# Output: False
print(&#039;g&#039; not in QTM)</pre>

<h3 id="mcetoc_1ckbiu1pk3" style="text-align: justify;">Lặp qua các phần tử của tuple trong Python</h3>

<p style="text-align: justify;">Sử dụng vòng lặp for để lặp qua các phần tử trong tuple.</p>

<pre id="pre91" style="text-align: justify;">
for ngon_ngu in (&#039;Python&#039;,&#039;C++&#039;,&#039;Web&#039;):
print(&quot;Tôi thích lập trình&quot;,ngon_ngu)</pre>

<p style="text-align: justify;">Kết quả trả về sẽ như sau:</p>

<pre id="pre92" style="text-align: justify;">
Tôi thích lập trình Python
Tôi thích lập trình C++
Tôi thích lập trình Web</pre>

<h2 id="mcetoc_1bth5unee5" style="text-align: justify;">6. Set</h2>

<p style="text-align: justify;">Set trong Python là tập hợp các phần tử duy nhất, không có thứ tự. Các phần tử trong set phân cách nhau bằng dấu phẩy và nằm trong dấu ngoặc nhọn {}. Nhớ kỹ rằng các phần tử trong set không có thứ tự. Nhưng các phần tử trong set có thể thay đổi, có thể thêm hoặc xóa phần tử của set. Set có thể được sử dụng để thực hiện các phép toán như tập hợp, giao,...</p>

<h3 id="mcetoc_1ckbrm6v60" style="text-align: justify;">Cách tạo set</h3>

<p style="text-align: justify;">Set được tạo bằng cách đặt tất cả các phần tử trong dấu ngoặc nhọn, phân tách bằng dấu phẩy hoặc sử dụng hàm set(). Set không giới hạn số lượng phần tử, nó có thể chứa nhiều kiểu biến khác nhau, nhưng không thể chứa phần tử có thể thay đổi được như list, set hay dictionary.</p>

<p style="text-align: justify;">Ví dụ về set:</p>

<pre id="pre93" style="text-align: justify;">
a = {5,2,3,1,4}</pre>

<p style="text-align: justify;">Nếu thực hiện lệnh in như sau:</p>

<pre id="pre94" style="text-align: justify;">
print(&quot;a=&quot;, a)</pre>

<p style="text-align: justify;">Bạn sẽ nhận được kết quả:</p>

<pre id="pre95" style="text-align: justify;">
a = {1, 2, 3, 4, 5}</pre>

<p style="text-align: justify;">Set với nhiều kiểu dữ liệu hỗn hợp như sau:</p>

<pre id="pre96" style="text-align: justify;">
my_set = {1.0, &quot;Xin chào&quot;, (1, 2, 3)}

#Output: QTM_Set= {&#039;Xin chào&#039;, 1.0, (1, 2, 3)}
print(&quot;QTM_Set=&quot;,my_set)</pre>

<p style="text-align: justify;">Tạo set rỗng có chút khó khăn. Cặp dấu {} sẽ tạo một dictionary trong Python. Để tạo set không có phần tử nào, ta sử dụng hàm set() mà không có đối số nào.</p>

<pre id="pre97" style="text-align: justify;">
# initialize a with {}
qtm = {}

# Kiểm tra kiểu dữ liệu của qtm
# Output: &lt;class &#039;dict&#039;&gt;
print(type(qtm))

# Khởi tạo qtm với set()
qtm = set()

# Kiểm tra kiểu dữ liệu của qtm
# Output: &lt;class &#039;set&#039;&gt;
print(type(qtm))</pre>

<h3 id="mcetoc_1ckbrm6v71" style="text-align: justify;">Làm sao để thay đổi set trong Python</h3>

<p style="text-align: justify;">Vì set là tập hợp các phần tử không có thứ tự nên chỉ mục chả có ý nghĩa gì với set. Do đó toán tử cắt &#91;&#93; sẽ không làm việc trên set. Nếu cố tình dùng, bạn sẽ nhận được thông báo lỗi như dưới đây:</p>

<pre id="pre98" style="text-align: justify;">
&gt;&gt;&gt; a&#91;1&#93;
Traceback (most recent call last):
File &quot;&lt;pyshell#2&gt;&quot;, line 1, in &lt;module&gt;
a&#91;1&#93;
TypeError: &#039;set&#039; object does not support indexing</pre>

<p style="text-align: justify;">Để thêm một phần tử vào set, bạn sử dụng add() và để thêm nhiều phần tử dùng update(). Update() có thể nhận tuple, list, strring và set làm đối số. Trong mọi trường hợp, Set có giá trị duy nhất, các bản sao sẽ tự động bị loại bỏ.</p>

<pre id="pre99" style="text-align: justify;">
# Khởi tạo my_set
my_set = {1,3}
print(my_set)

# Nếu bỏ dấu # ở dòng 9,
# Bạn sẽ nhận được lỗi
# TypeError: &#039;set&#039; object does not support indexing

#my_set&#91;0&#93;

# Thêm phần tử
# Output: {1, 2, 3}
my_set.add(2)
print(my_set)

# Thêm nhiều phần tử vào set
# Output: {1, 2, 3, 4}
my_set.update(&#91;2,3,4&#93;)
print(my_set)

# Thêm list và set
# Output: {1, 2, 3, 4, 5, 6, 8}
my_set.update(&#91;4,5&#93;, {1,6,8})
print(my_set)</pre>

<h3 id="mcetoc_1ckbrm6v72" style="text-align: justify;">Xóa phần tử khỏi set</h3>

<p style="text-align: justify;">Bạn dùng discard() và remove() để xóa phần tử cụ thể khỏi set. Khi phần tử cần xóa không tồn tại trong set thì discard() không làm gì cả, còn remove() sẽ báo lỗi.</p>

<pre id="pre100" style="text-align: justify;">
# Khởi tạo my_set
my_set = {1, 3, 4, 5, 6}
print(my_set)

# Xóa phần tử bằng discard()
# Output: {1, 3, 5, 6}
my_set.discard(4)
print(my_set)

# Xóa bằng remove()
# Output: {1, 3, 5}
my_set.remove(6)
print(my_set)

# Xóa phần tử không có 
# trong set bằng discard()
# Output: {1, 3, 5}
my_set.discard(2)
print(my_set)

# Xóa phần tử không có 
# trong set bằng remove()
# Nếu bạn bỏ dấu # ở dòng 27,
# bạn sẽ nhận được lỗi.
# Output: KeyError: 2

#my_set.remove(2)</pre>

<p style="text-align: justify;">Bạn có thể xóa và trả lại một mục bằng phương thức pop(). Set không có thứ tự, không có cách nào để xác định phần tử nào sẽ bị xóa, điều này diễn ra hoàn toàn ngẫu hứng. Việc xóa hoàn toàn set được thực hiện bằng cách dùng clear().</p>

<pre id="pre101" style="text-align: justify;">
# Khởi tạo my_set
# Output: set of unique elements
my_set = set(&quot;Quantrimang.com&quot;)
print(my_set)

# xóa phần tử bằng pop()
# Output: phần tử bị xóa ngẫu nhiên
print(my_set.pop())

# xóa phần tử khác bằng pop()
# Output: phần tử bị xóa ngẫu nhiên
my_set.pop()
print(my_set)

# clear my_set
#Output: set()
my_set.clear()
print(my_set)</pre>

<h3 id="mcetoc_1ckbrm6v73" style="text-align: justify;">Các toán tử set trong Python</h3>

<p style="text-align: justify;">Set thường được sử dụng để chứa các toán tử tập hợp như hợp, giao, hiệu, bù. Có cả phương thức và toán tử để thực hiện những phép toán tập hợp này.</p>

<p style="text-align: justify;">Ta sẽ sử dụng 2 tập hợp dưới đây:</p>

<pre id="pre102" style="text-align: justify;">
&gt;&gt;&gt; A = {1, 2, 3, 4, 5}
&gt;&gt;&gt; B = {4, 5, 6, 7, 8}</pre>

<p style="text-align: justify;"><strong>Hợp của A và B</strong>&nbsp;là tập hợp tất cả các phần tử của A và B. Hợp được biểu diễn bằng cách sử dụng toán tử | hoặc sử dụng phương thức union().</p>

<pre id="pre103" style="text-align: justify;">
# Khởi tạo A và B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# sử dụng toán tử | 
# Output: {1, 2, 3, 4, 5, 6, 7, 8}
print(A | B)

# sử dụng hàm union()
# Output: Như trên
print(A.union(B))
print(B.union(A))</pre>

<p style="text-align: justify;"><strong>Giao của A và B</strong>&nbsp;là tập hợp những phần tử chung của A và B. Để tìm giao của A và B ta có thể dùng toán tử &amp; hoặc hàm intersection().</p>

<pre id="pre104" style="text-align: justify;">
# khởi tạo A và B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# sử dụng &amp; 
# Output: {4, 5}
print(A &amp; B)

# sử dụng intersection()
# Output: {4, 5}
print(A.intersection(B))
print(B.intersection(A))</pre>

<p style="text-align: justify;"><strong>Hiệu của A và B</strong>&nbsp;(A-B) là tập hợp phần tử chỉ có trong A, không có trong B. Hiệu của B và A (B-A) là tập hợp phần tử chỉ có trong B không có trong A. Có thể sử dụng toán tử - hoặc hàm difference() để thực hiện phép toán tập hợp này.</p>

<pre id="pre105" style="text-align: justify;">
# Khởi tạo A và B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# Sử dụng toán tử - trên A
# Output: {1, 2, 3}
print(A - B)
# Sử dụng hàm difference() trên A
# Output: {1, 2, 3}
print(A.difference(B))

# Sử dụng toán tử - trên B
# Output: {8, 6, 7}
print(B - A)

# Sử dụng difference() trên B
# Output: {8, 6, 7}
print(B.difference(A))</pre>

<p style="text-align: justify;">Bù của A và B là tập hợp những phần tử có trong A và B nhưng không phải phần tử chung của hai tập hợp này. Bạn có thể dùng toán tử ^ hoặc hàm symmetric_difference() để thực hiện phép bù.</p>

<pre id="pre106" style="text-align: justify;">
# Khởi tạo A và B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# Sử dụng toán tử ^
# Output: {1, 2, 3, 6, 7, 8}
print(A ^ B)
# Sử dụng symmetric_difference() trên A
# Output: {1, 2, 3, 6, 7, 8}
print(A.symmetric_difference(B))</pre>

<h3 id="mcetoc_1ckbrm6v74" style="text-align: justify;">Các phương thức dùng trên set</h3>

<table border="1">
	<tbody>
		<tr>
			<td style="text-align: justify;"><strong>Phương thức</strong></td>
			<td style="text-align: justify;"><strong>Mô tả</strong></td>
		</tr>
		<tr>
			<td style="text-align: justify;">add()</td>
			<td style="text-align: justify;">Thêm một phần tử vào set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">clear()</td>
			<td style="text-align: justify;">Xóa tất cả phần tử của set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">copy()</td>
			<td style="text-align: justify;">Trả về bản sao chép của set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">difference()</td>
			<td style="text-align: justify;">Trả về set mới chứa những phần tử khác nhau của 2 hay nhiều set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">difference_update()</td>
			<td style="text-align: justify;">Xóa tất cả các phần tử của set khác từ set này.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">discard()</td>
			<td style="text-align: justify;">Xóa phần tử nếu nó có mặt trong set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">intersection()</td>
			<td style="text-align: justify;">Trả về set mới chứa phần tử chung của 2 set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">intersection_update()</td>
			<td style="text-align: justify;">Cập nhật set với phần tử chung của chính nó và set khác.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">isdisjoint()</td>
			<td style="text-align: justify;">Trả về True nếu 2 set không có phần tử chung.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">issubset()</td>
			<td style="text-align: justify;">Trả về True nếu set khác chứa set này.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">issuperset()</td>
			<td style="text-align: justify;">Trả về True nếu set này chưa set khác.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">pop()</td>
			<td style="text-align: justify;">Xóa và trả về phần tử ngẫu nhiên, báo lỗi KeyError nếu set rỗng.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">remove()</td>
			<td style="text-align: justify;">Xóa phần tử từ set. Nếu phần tử đó không có trong set sẽ báo lỗi KeyError.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">symmetric_difference()</td>
			<td style="text-align: justify;">Trả về set mới chứa những phần tử không phải là phần tử chung của 2 set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">symmetric_difference_update()</td>
			<td style="text-align: justify;">Cập nhật set với những phần tử khác nhau của chính nó và set khác.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">union()</td>
			<td style="text-align: justify;">Trả về set mới là hợp của 2 set.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">update()</td>
			<td style="text-align: justify;">Cập nhật set với hợp của chính nó và set khác.</td>
		</tr>
	</tbody>
</table>

<h3 id="mcetoc_1ckbud0g60" style="text-align: justify;">Kiểm tra phần tử trong set</h3>

<p style="text-align: justify;">Bạn có thể kiểm tra một đối tượng xem nó có nằm trong set không, sử dụng từ khóa in.</p>

<pre id="pre107" style="text-align: justify;">
# Khởi tạo my_set
my_set = set(&quot;Quantrimang.com&quot;)

# Kiểm tra xem Q có trong my_set không
# Output: True
print(&#039;Q&#039; in my_set)

# Kiểm tra xem q có trong my_set không
# Output: False
print(&#039;q&#039; in my_set)</pre>

<h3 id="mcetoc_1ckbud0g61" style="text-align: justify;">Lặp qua phần tử của set</h3>

<p style="text-align: justify;">Sử dụng vòng lặp for để lặp qua các phần tử của set.</p>

<pre id="pre108" style="text-align: justify;">
for letter in set(&quot;Python&quot;):
print(letter)</pre>

<p style="text-align: justify;">Chạy code trên bạn nhận được kết quả như sau:</p>

<pre id="pre109" style="text-align: justify;">
t
y
P
h
o
n</pre>

<h3 id="mcetoc_1ckbud0g62" style="text-align: justify;">Hàm thường dùng trên set</h3>

<p style="text-align: justify;">Các hàm thường dùng trên set bao gồm all(), any(), enumerate(), len(), max(), min(), sorted(), sum(). Chức năng của những hàm này khá giống với khi bạn sử dụng trên list, tuple, bạn có thể tham khảo thêm nếu chưa rõ nha.</p>

<table cellpadding="3" cellspacing="3">
	<tbody>
		<tr>
			<td>
			<p style="text-align: justify;"><strong>Hàm</strong></p>
			</td>
			<td>
			<p style="text-align: justify;"><strong>Mô tả</strong></p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>all()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về True nếu tất cả thành phần của set đều là true (hoặc nếu set là empty).</p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>any()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về True nếu phần tử bất kỳ được thiết lập là true. Nếu set là empty, trả về False .</p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>enumerate()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về một đối tượng liệt kê. Nó chứa chỉ mục và giá trị cho tất cả các mục của tập hợp dưới dạng một cặp.</p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>len()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về độ dài (số của các mục) trong set.</p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>max()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về mục lớn nhất trong set.</p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>min()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về mục nhỏ nhất trong set.</p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>sorted()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về danh sách đã phân loại mới từ phần tử trong set (không tự sắp xếp set đó)</p>
			</td>
		</tr>
		<tr>
			<td>
			<p style="text-align: justify;"><a>sum()</a></p>
			</td>
			<td>
			<p style="text-align: justify;">Trả về tổng số tất cả các phần tử trong set.</p>
			</td>
		</tr>
	</tbody>
</table>

<h3 id="mcetoc_1ckbud0g63" style="text-align: justify;">Frozenset trong Python</h3>

<p style="text-align: justify;">Frozenset là một lớp mới, có đặc điểm của một set, nhưng phần tử của nó không thể thay đổi được sau khi gán. Để dễ hình dung thì tuple là list bất biến còn frozenset là set bất biến.</p>

<p style="text-align: justify;">Các set có thể thay đổi được nhưng không thể băm (hash) được, do đó không thể sử dụng set để làm key cho dictionary. Nhưng frozenset có thể băm được nên có thể dùng như các key cho dictionary.</p>

<p style="text-align: justify;">Frozenset có thể tạo bằng hàm frozenset(). Kiểu dữ liệu này hỗ trợ các phương thức như copy(), difference(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference() và union(). Vì không thể thay đổi nên phương thức add() hay remove() không sử dụng được trên frozenset.</p>

<h2 id="mcetoc_1bth6iuio6" style="text-align: justify;">7. Dictionary</h2>

<p style="text-align: justify;">Dictionary trong Python là một cấu trúc dữ liệu tương tự như một mảng kết hợp được tìm thấy ở các ngôn ngữ lập trình khác.Một mảng hay danh sách đánh chỉ mục các nhân tố theo vị trí. Nói cách khác, một dictionary chỉ mục theo keys. Chúng có thể ở dạng chuỗi.</p>

<h3 id="mcetoc_1cn0q4mql0" style="text-align: justify;">Cách tạo dictionary trong Python</h3>

<p style="text-align: justify;">Trong Python, dictionary được định nghĩa trong dấu ngoặc nhọn {} với mỗi phần tử là một cặp theo dạng key:value. Key và value này có thể là bất kỳ kiểu dữ liệu nào. Bạn cũng có thể tạo dictionary bằng cách sử dụng hàm dict() được tích hợp sẵn.</p>

<p style="text-align: justify;">Ví dụ:</p>

<pre id="pre110" style="text-align: justify;">
dict1 = {} #dictionary rỗng
#dict2 là dictionary với các khóa nguyên
dict2 = {1: &#039;Quantrimang.com&#039;,2: &#039;Công nghệ&#039;}
#Tạo dictionary với khóa hỗn hợp
dict3 = {&#039;tên&#039;: &#039;QTM&#039;, 1: &#91;1, 3, 5&#93;}
#Tạo dictionary bằng dict()
dict4 = dict({1:&#039;apple&#039;, 2:&#039;ball&#039;})
#Tạo dictionary từ chuỗi với mỗi mục là một cặp
dict5 = dict(&#91;(1,&#039;QTM&#039;), (2,&#039;CN&#039;)&#93;)</pre>

<p style="text-align: justify;">Khi thực hiện kiểm tra kiểu dữ liệu của d ta được kết quả:</p>

<pre id="pre111" style="text-align: justify;">
&gt;&gt;&gt; type(dict2)
&lt;class &#039;dict&#039;&gt;</pre>

<h3 style="text-align: justify;">Trích xuất mảng</h3>

<p style="text-align: justify;">Phương thức sau mô tả việc trích xuất thông tin dictionary Python dưới dạng biểu mẫu theo mảng. Mảng kết quả có thể được lặp qua việc dùng cấu trúc Python bình thường. Tuy nhiên, nhớ mảng trả về có thể lớn, tùy thuộc vào kích thước của dictionary. Do đó, tốt hơn hết máy tính của bạn nên có nhiều dung lượng để xử lý mảng. ví dụ:</p>

<pre id="pre112" style="text-align: justify;">
users = {&#039;firstname&#039;: &#039;John&#039;, &#039;lastname&#039;: &#039;Smith&#039;, &#039;age&#039;: 27}
print(users.keys())
# prints
&#91;&#039;lastname&#039;, &#039;age&#039;, &#039;firstname&#039;&#93;</pre>

<h3 id="mcetoc_1cn0q4mql1" style="text-align: justify;">Truy cập phần tử của dictionary</h3>

<p style="text-align: justify;">Các kiểu dữ liệu lưu trữ khác sử dụng index để truy cập vào các giá trị thì dictionary sử dụng các key. Key có thể được sử dụng trong cặp dấu ngoặc vuông hoặc sử dụng get().</p>

<p style="text-align: justify;">Sử dụng khóa để trích xuất dữ liệu:</p>

<pre id="pre113" style="text-align: justify;">
#khai báo và gán giá trị dict2
dict2 = {1: &#039;Quantrimang.com&#039;,&#039;quantrimang&#039;: &#039;Công nghệ&#039;} 
print(type(dict2)) #in kiểu dữ liệu của dict2
#trích xuất dữ liệu bằng khóa rồi in
print(&quot;dict2&#91;1&#93; = &quot;, dict2&#91;1&#93;) 
print(&quot;dict2&#91;quantrimang&#93; = &quot;,dict2&#91;&#039;quantrimang&#039;&#93;)</pre>

<p style="text-align: justify;">Chạy đoạn code trên ta sẽ được kết quả:</p>

<pre id="pre114" style="text-align: justify;">
&lt;class &#039;dict&#039;&gt;
dict2&#91;1&#93; = Quantrimang.com
dict2&#91;quantrimang&#93; = Công nghệ</pre>

<p style="text-align: justify;"><strong>Truy cập khóa - giá trị trong dictionary</strong></p>

<p style="text-align: justify;">Để truy cập các mục của một dictionary, hãy tham chiếu tới tên khóa (key) của nó. Key ở đây có thể được dùng bên trong các dấu ngoặc vuông. Ngoài ra, lập trình viên còn có một phương thức tên get() cũng giúp truy cập thành phần này từ một dictionary.</p>

<pre id="pre115" style="text-align: justify;">
# Ví dụ lập trình Python minh họa cách truy cập một phần tử từ dictionary
# Tạo một Dictionary
Dict = {1: &#039;Geeks&#039;, &#039;name&#039;: &#039;For&#039;, 3: &#039;Geeks&#039;}
# Truy cập phần tử bằng key
print(&quot;Accessing a element using key:&quot;)
print(Dict&#91;&#039;name&#039;&#93;)
# Truy cập phần tử bằng get()
# Phương thức
print(&quot;Accessing a element using get:&quot;)
print(Dict.get(3))</pre>

<p style="text-align: justify;">Kết quả:</p>

<pre id="pre116" style="text-align: justify;">
Truy cập một phần tử bằng key:
For
Truy cập một phần tử bằng get:
Geeks</pre>

<h3 id="mcetoc_1cn0q4mql2" style="text-align: justify;">Thay đổi, thêm phần tử cho dictionary</h3>

<p style="text-align: justify;">Dictionary có thể thay đổi, nên có thể thêm phần tử mới hoặc thay đổi giá trị của các phần tử hiện có bằng cách sử dụng toán tử gán. Nếu key đã có, giá trị sẽ được cập nhật, nếu là một cặp key: value mới thì sẽ được thêm thành phần tử mới.</p>

<pre id="pre117" style="text-align: justify;">
dict2 = {1: &#039;Quantrimang.com&#039;,&#039;quantrimang&#039;: &#039;Công nghệ&#039;}

#cập nhật giá trị
dict2&#91;&#039;quantrimang&#039;&#93; = &#039;Quản trị mạng&#039;

#output: {1: &#039;Quantrimang.com&#039;, &#039;quantrimang&#039;: &#039;Quản trị mạng&#039;}
print(dict2)

#thêm phần tử mới
dict2&#91;2&#93; = &#039;Python&#039;

#output: {1: &#039;Quantrimang.com&#039;, &#039;quantrimang&#039;: &#039;Quản trị mạng&#039;, 2: &#039;Python&#039;}
print(dict2)</pre>

<h3 id="mcetoc_1cn0q4mql3" style="text-align: justify;">Xóa phần tử từ dictionary</h3>

<p style="text-align: justify;">Bạn có thể xóa phần tử cụ thể của dictionary bằng cách sử dụng pop(), nó sẽ phần tử có key đã cho và trả về giá trị của phần tử. popitem() có thể xóa và trả về một phần tử tùy ý dưới dạng (key, value). Tất cả các phần tử trong dictionary có thể bị xóa cùng lúc bằng cách dùng clear(). Ngoài ra, từ khóa del cũng có thể dùng để xóa một phần tử hoặc toàn bộ dictionary.</p>

<pre id="pre118" style="text-align: justify;">
# tạo dictionary
binh_phuong = {1:1, 2:4, 3:9, 4:16, 5:25}

# xóa phần tử số 4
# Output: 16
print(binh_phuong.pop(4))

# Output: {1: 1, 2: 4, 3: 9, 5: 25}
print(binh_phuong)

# xóa phần tử cụ thể
del binh_phuong&#91;2&#93;

# output: {1: 1, 3: 9, 5: 25}
print(binh_phuong)

# xóa phần tử bất kỳ
# Output: (5, 25)
print(binh_phuong.popitem())

# Output: {1: 1, 3: 9}
print(binh_phuong)

# xóa tất cả phần tử
binh_phuong.clear()

# output: {}
print(binh_phuong)

# xóa dictionary binh_phuong
del binh_phuong

# tạo lỗi nếu bỏ # ở lệnh sau
# print(squares)</pre>

<h3 id="mcetoc_1cn0q4mql4" style="text-align: justify;">Các phương thức và hàm cho dictionary</h3>

<p style="text-align: justify;">Đây là những phương thức thường dùng với dictionary:</p>

<table border="1">
	<tbody>
		<tr>
			<th scope="col" style="text-align: justify;">Method</th>
			<th scope="col" style="text-align: justify;">Mô tả</th>
		</tr>
		<tr>
			<td style="text-align: justify;">clear()</td>
			<td style="text-align: justify;">Xóa tất cả phần tử của dictionary.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">copy()</td>
			<td style="text-align: justify;">Trả về một bản sao shollow copy của dictionary.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">fromkeys(seq&#91;,v&#93;)</td>
			<td style="text-align: justify;">Trả về dictionary mới với key từ seq và value bằng v (default là&nbsp;<code>None</code>).</td>
		</tr>
		<tr>
			<td style="text-align: justify;">get(key&#91;,d&#93;)</td>
			<td style="text-align: justify;">Trả về giá trị của key, nếu key không tồn tại, trả về d. (default là&nbsp;<code>None</code>).</td>
		</tr>
		<tr>
			<td style="text-align: justify;">items()</td>
			<td style="text-align: justify;">Trả lại kiểu xem mới của các phần tử trong dictionary (key, value).</td>
		</tr>
		<tr>
			<td style="text-align: justify;">keys()</td>
			<td style="text-align: justify;">Trả về kiểu xem mới của các key trong dictionary.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">pop(key&#91;,d&#93;)</td>
			<td style="text-align: justify;">Xóa phần tử bằng key và trả về giá trị hoặc d nếu key không tìm thấy. Nếu d không được cấp, key không tồn tại thì sẽ tạo lỗi&nbsp;<code>KeyError</code>.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">popitem()</td>
			<td style="text-align: justify;">Xóa và trả về phần tử bất kỳ ở dạng (key, value). Tạo lỗi&nbsp;<code>KeyError</code>&nbsp;nếu dictionary rỗng.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">setdefault(key,&#91;,d&#93;)</td>
			<td style="text-align: justify;">Nếy key tồn tại trả về value của nó, nếu không thêm key với value là d và trả về d (default là&nbsp;<code>None</code>).</td>
		</tr>
		<tr>
			<td style="text-align: justify;">update(&#91;other&#93;)</td>
			<td style="text-align: justify;">Cập nhật dictionary với cặp key/value từ&nbsp;other, ghi đè lên các key đã có.</td>
		</tr>
		<tr>
			<td style="text-align: justify;">values()</td>
			<td style="text-align: justify;">Trả về kiểu view mới của value trong dictionary.</td>
		</tr>
	</tbody>
</table>

<p style="text-align: justify;">Các hàm tích hợp như all(), any(), len(), cmp(), sorted(),... thường được sử dụng với dictionary để thực hiện những nhiệm vụ khác nhau.</p>

<h3 id="mcetoc_1cn0sed5p0" style="text-align: justify;">Dictionary comprehension trong Python</h3>

<p style="text-align: justify;">Dictionary comprehension là cách đơn giản, rút gọn để tạo dictionary mới từ một vòng lặp trong Python. Câu lệnh sẽ bao gồm một cặp biểu thức (key:value) cùng câu lệnh for, tất cả đặt trong dấu {}. Dưới đây là ví dụ tạo dictionary với mỗi pahàn tử là một cặp số và lập phương của nó.</p>

<pre id="pre119" style="text-align: justify;">
lap_phuong = {x: x*x*x for x in range(6)}

# Output: {0: 0, 1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
print(lap_phuong)</pre>

<p style="text-align: justify;">Chương trình trên tương đương với</p>

<pre id="pre120" style="text-align: justify;">
lap_phuong = {}
for x in range(6):
lap_phuong&#91;x&#93; = x*x*x
print(lap_phuong)</pre>

<p style="text-align: justify;">Bạn cũng có thể sử dụng lệnh if trong dictionary comprehension. Lệnh if có thể lọc những phần tử trong dictionary hiện có để tạo thành dictionary mới như ví dụ dưới đây:</p>

<pre id="pre121" style="text-align: justify;">
lap_phuong_chan = {x: x*x*x for x in range (10) if x%2==0}
# output: {0: 0, 2: 8, 4: 64, 6: 216, 8: 512}
print(lap_phuong_chan)</pre>

<h3 id="mcetoc_1cn0sed5p1" style="text-align: justify;">Kiểm tra và lặp qua phần tử trong dictionary</h3>

<p style="text-align: justify;">Bạn chỉ có thể kiểm tra key của phần tử đã có trong dictionary hay chưa bằng cách dùng in, và không thể làm điều đó với value.</p>

<pre id="pre122" style="text-align: justify;">
lap_phuong = {0: 0, 1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
#output: True
print (2 in lap_phuong)
#output: False
print (9 in lap_phuong)
#output: False
print (5 not in lap_phuong)</pre>

<p style="text-align: justify;">Bạn có thể sử dụng vòng lặp for để lặp qua key của các phần tử trong dictionary.</p>

<pre id="pre123" style="text-align: justify;">
lap_phuong = {0: 0, 1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
for i in lap_phuong
print(lap_phuong&#91;i&#93;)</pre>

<p style="text-align: justify;">Chạy code trên, các giá trị tương ứng với từng key sẽ được in ra màn hình theo thứ tự của key.</p>

<h2 id="mcetoc_1cf9ja1n18" style="text-align: justify;">8. Chuyển đổi giữa các kiểu dữ liệu</h2>

<p style="text-align: justify;">Chúng ta có thể chuyển đổi giữa các kiểu dữ liệu khác nhau bằng cách sử dụng hàm chuyển đổi kiểu khác nhau như int() (kiểu số nguyên), float() số thập phân, str() chuỗi,...</p>

<p style="text-align: justify;"><strong>Ví dụ:</strong></p>

<pre id="pre124" style="text-align: justify;">
&gt;&gt;&gt; float(11)
11.0</pre>

<p style="text-align: justify;">Chuyển đổi từ kiểu float sang kiểu int sẽ bị giảm giá trị (làm cho nó gần với số không hơn).</p>

<p style="text-align: justify;"><strong>Ví dụ:</strong></p>

<pre id="pre125" style="text-align: justify;">
int(18.6)
18</pre>

<p style="text-align: justify;">Chuyển đổi từ string sang hoặc ngược lại phải có các giá trị tương thích.</p>

<p style="text-align: justify;">Bạn có thể thực hiện chuyển đổi chuỗi này sang chuỗi khác:</p>

<pre id="pre126" style="text-align: justify;">
&gt;&gt;&gt; set(&#91;2,4,6&#93;)
{2,4,6}
&gt;&gt;&gt; tuple({3,5,7})
(3,5,7)
&gt;&gt;&gt; list(&#039;quantrimang&#039;)
&#91;&#039;q&#039;, &#039;u&#039;, &#039;a&#039;, &#039;n&#039;, &#039;t&#039;, &#039;r&#039;, &#039;i&#039;, &#039;m&#039;, &#039;a&#039;, &#039;n&#039;, &#039;g&#039;&#93;</pre>

<p style="text-align: justify;">Để chuyển đổi sang dictionary, mỗi phần tử phải là một cặp như ví dụ dưới đây:</p>

<pre id="pre127" style="text-align: justify;">
&gt;&gt;&gt; dict(&#91;&#91;2,4&#93;,&#91;1,3&#93;&#93;)
{2: 4, 1: 3}
&gt;&gt;&gt; dict(&#91;(3,9),(4,16)&#93;)
{3: 9, 4: 16}</pre>

<h2 id="mcetoc_1bs0qd2em1" style="text-align: justify;">9. Bước đầu tiên hướng tới lập trình</h2>

<p style="text-align: justify;">Tất nhiên, chúng ta có thể sử dụng Python cho những tác vụ phức tạp hơn là thêm vài phần tử vào chuỗi. Ví dụ, có thể viết một chuỗi con của dãy Fibonacci (dãy vô hạn các số tự nhiên bắt đầu bằng hai phần tử 0 và 1 hoặc 1 và 1, các phần tử sau đó được thiết lập bằng cách cộng hai phần tử trước nó lại) như sau:</p>

<pre id="pre128" style="text-align: justify;">
&gt;&gt;&gt; # Dãy Fibonacci:
... # tổng của hai phần tử tạo nên phần tử tiếp theo
... a, b = 0, 1
&gt;&gt;&gt; while b &lt; 10:
... print(b)
... a, b = b, a+b
...
1
1
2
3
5
8</pre>

<p style="text-align: justify;">Ví dụ này giới thiệu một số tính năng mới:</p>

<ul>
	<li style="text-align: justify;"><strong>Dòng đầu tiên chứa một phép gán kép:</strong>&nbsp;Biến a và b đồng thời nhận được giá trị 0 và 1. Dòng cuối cùng, nó được sử dụng lại, thể hiện rằng các biểu thức ở phía bên phải sẽ được tính (ở đây là cộng tổng a và b) trước khi bất kỳ hành động gán nào được diễn ra. Biểu thức bên phải được tính từ trái sang phải</li>
	<li style="text-align: justify;"><strong>Vòng lặp while sẽ được thực thi nếu điều kiện (ở đây là b&lt;10) vẫn đúng:</strong>&nbsp;Trong Python, cũng giống C, bất kỳ giá trị số nguyên khác 0 nào cũng đúng, 0 là sai. Điều kiện có thể là một chuỗi, danh sách, thậm chí một chuỗi tuần tự hay bất cứ thứ gì có độ dài khác 0 đều đúng, chuỗi rỗng sẽ sai. Phép kiểm tra trong ví dụ trên là một so sánh khá đơn giản. Các toán tử so sánh chuẩn được viết giống như C: &lt; (nhỏ hơn), &gt; (lớn hơn), == (bằng), &lt;=, &gt;= và != (không bằng/khác).</li>
	<li style="text-align: justify;"><strong>Thân của vòng lặp được viết thụt vào trong:</strong>&nbsp;Thụt đầu dòng là cách mà Python nhóm các lệnh. Tại dấu nhắc lệnh, bạn có thể nhấn tab hoặc phím cách để thụt lề. Một trình soạn thảo code sẽ hỗ trợ tốt hơn cho việc nhập những đoạn code Python phức tạp, thông thường các trình soạn thảo này đề có thụt lề tự động. Khi nhập một khối lệnh bạn phải chèn thêm một dòng trống ở cuối cùng để kết thúc khối lệnh (vì trình phân tích cú pháp không thể phân tích khi nào bạn hoàn tất dòng lệnh cuối cùng trong khối). Lưu ý là mỗi dòng trong một khối lệnh cơ bản phải được thụt vào cùng một khoảng giống nhau.</li>
	<li style="text-align: justify;"><strong>Hàm print() viết ra giá trị của các đối số mà nó được cung cấp:</strong>&nbsp;Nó khác với việc chỉ viết những biểu thức bạn muốn viết (như trong ví dụ dùng Python như một chiếc máy tính) theo cách xử lý nhiều đối số, số lượng dấu chấm động và chuỗi. Các chuỗi được in sẽ không có dấu ngoặc kép, một khoảng trắng được chèn vào giữa các mục, do đó, bạn có thể định dạng chúng theo ý thích, giống như thế này:</li>
</ul>

<pre id="pre129" style="text-align: justify;">
&gt;&gt;&gt; i = 256*256
&gt;&gt;&gt; print(&#039;The value of i is&#039;, i)
The value of i is 65536</pre>

<p style="text-align: justify;">Có thể sử dụng thêm đối số end cho hàm print() để tránh thêm dòng mới trong kết quả đầu ra hoặc kết thúc kết quả với một chuỗi khác:</p>

<pre id="pre130" style="text-align: justify;">
&gt;&gt;&gt; a, b = 0, 1
&gt;&gt;&gt; while b &lt; 1000:
... print(b, end=&#039;,&#039;)
... a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,</pre>

<p style="text-align: justify;">Đến đây các bạn đã bắt đầu hình dung được phần nào về Python rồi đúng không? Hãy cùng chờ đón những bài học tiếp theo về các câu lệnh, cấu trúc dữ liệu trong Python nhé.</p>

<div style="text-align: justify;">&nbsp;</div>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com:
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/kieu-du-lieu-trong-python-chuoi-so-list-tuple-set-va-dictionary-10708.html" title="Kiểu dữ liệu trong Python&#x3A; chuỗi, số, list, tuple, set và dictionary">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/kieu-du-lieu-trong-python-chuoi-so-list-tuple-set-va-dictionary-10708.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://www.nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://www.nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<script src="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://www.nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://www.nguoicodonvn2008.info",
            "logo": "https://www.nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>