Tải bản đầy đủ (.pdf) (84 trang)

giáo trình lập trình python nâng cao nghề tin học ứng dụng cao đẳng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (828.28 KB, 84 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

Uỵ BAN NHN DN THNH PH Hâ CHÍ MINH

<b>TR¯âNG CAO ĐÀNG BÁCH KHOA NAM SÀI GỊN </b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>LâI GIàI THIÞU </b>

Mơn hác này thuộc khái kiến thāc chun mơn nghề trong ch°¢ng trình đào t¿o ngành tin hác āng dụng há cao đẳng. LÁp trình Python nâng cao là mơn hác b¿t buộc trong ch°¢ng trình ngành Tin hác āng dụng trình độ cao đẳng.

Nội dung giáo trình gãm 4 ch°¢ng:

- Ch°¢ng 1: LÁp trình h°ớng đái t°ợng - Ch°¢ng 2: Làm viác với tÁp tin XML - Ch°¢ng 3: Làm viác với dữ liáu JSON

- Ch°¢ng 4: Xây dựng āng dụng với c¢ sá dữ liáu - Ch°¢ng 5: Sets và dictionaries

Trong q trình biên so¿n chúng tơi đã kết hợp kinh nghiám giÁng d¿y trong nhiều năm cÿa nhóm tác giÁ với mong muán có thể giúp cho hác sinh 3 sinh viên dß dàng n¿m b¿t đ°ợc nội dung cÿa môn hác. Mặc dù, rất cá g¿ng trong q trình biên so¿n, nh°ng ch¿c ch¿n khơng thể tránh khßi những thiếu sót, vì vÁy, nhóm tác giÁ chúng tơi rất mong nhÁn đ°ợc ý kiến đóng góp cÿa b¿n đác để giáo trình ngày một hồn thián h¢n.

Tp.HCM , ngày 30 tháng 01 năm 2022 Tham gia biên so¿n

1. Chÿ biên: ThS Đào Thß Xuân H°ßng 2. &&&&

3. &&&&. &&&&&

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>MĀC LĀCContents </b>

Ch°¢ng 1. LÁp trình h°ớng đái t°ợng ... 1

1.1. Lớp và đái t°ợng ... 1

1.1.1. Một sá khái niám h°ớng đái t°ợng ... 1

1.1.2. T¿o các lớp trong Python ... 2

1.1.3. Phân biát giữa Đái t°ợng (Object) và Lớp (Class): ... 3

1.1.4. So sánh class cha và class con... 4

1.1.5. T¿o Instance trong Python: ... 5

1.1.6. Thêm, xóa, hoặc sửa đổi các thuộc tính cÿa các lớp và đái t°ợng t¿i bất cā thßi điểm nào. ... 7

1.1.7. Hÿy đái t°ợng (Trình dán rác) trong Python: ... 8

1.2. Ph°¢ng thāc: ... 10

1.2.1. Ghi đè ph°¢ng thāc trong Python: ... 11

1.2.2. N¿p chãng ph°¢ng thāc trong Python:... 11

1.2.3. N¿p chãng toán tử trong Python ... 12

1.2.4. Àn dữ liáu (Data Hiding) trong Python ... 13

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

2.1.2. Đặc điểm cÿa file XML ... 24

2.1.3. ¯u điểm cÿa file .xml ... 25

2.1.4. Nh°ợc điểm cÿa XML ... 26

2.1.5. Āng dụng phổ biến cÿa XML ... 26

2.1.6. Đác (read) file XML với BeautifulSoup ... 27

2.1.7. Các hàm cÿa BeautifulSoup th°ßng đ°ợc sử dụng để đác file XML nh°:282.1.8. Module ElementTree ... 28

2.1.9. Đác (read) file XML với minidom ... 29

2.2. Cấu trúc tÁp tin XML với SAX APIs ... 30

2.2.1. Ph°¢ng thāc make_parser trong Python... 31

2.2.2. Ph°¢ng Thāc Parse Trong Python ... 31

2.2.3. Ph°¢ng Thāc Parsestring Trong Python ... 32

2.2.4. Phân tích cú pháp XML với DOM APIs ... 34

Bài tÁp có h°ớng d¿n. ... 35

Ch°¢ng 3. Làm viác với dữ liáu JSON ... 37

3.1. Giới thiáu JSON ... 37

3.2. Cấu trúc JSON ... 38

3.3. Xử lý Json với Python ... 39

3.3.1. Convert JSON trong Python ... 46

3.3.2. Convert object Python thành JSON ... 47

3.3.3. Format hiển thß ... 49

3.3.4. S¿p xếp key ... 49

3.4. Đác, xử lý dữ liáu JSON từ internet ... 49

3.5. Má, đác, ghi dữ liáu và tÁp tin .jason ... 53

3.5.1. Ghi JSON vào một táp ... 53

3.5.2. Đác JSON từ một táp: ... 54

Bài tÁp có h°ớng d¿n. ... 55

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Bài tÁp. ... 61

Ch°¢ng 4. Xây dựng āng dụng với c¢ sá dữ liáu ... 62

4.1. Giới thiáu Há QTCSDL SQLite ... 62

4.1.1. Cách Cài Đặt Mysqldb ... 62

4.2. Python sqlite module APIs ... 63

4.2.1. Kết Nái Database Trong Python... 63

4.2.2. T¿o BÁng Dữ Liáu Trong Python ... 63

4.2.3. Thêm dữ liáu trong python: ... 64

4.2.4. Đác dữ liáu trong python: ... 66

4.2.5. CÁp nhÁt dữ liáu trong Python ... 68

4.2.6. Xoá dữ liáu trong Python ... 69

4.2.7. Ng¿t kết nái tới database trong python ... 69

4.3. Xây dựng āng dụng ... 69

4.4. Bài tÁp ... 75

TÀI LIàU THAM KHÀO ... 77

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>GIÁO TRÌNH MƠN LÀP TRÌNH PYTHON NÂNG CAO </b>

<b>Tên mơn hác/mơ đun: LÁp Trình Python Nâng Cao </b>

<b>Mã mơn hác/mơ đun: MH26 </b>

<b>Vß trí, tính chất, ý nghĩa và vai trị cÿa mơn hác/mơ đun: </b>

<b>- Vß trí: : Mơn hác này thuộc khái kiến thāc chun mơn, b¿t buộc trong ch°¢ng trình đào t¿o bÁc cao đẳng ngành Tin hác āng dụng. </b>

<b>- Tính chất: là mơn hác b¿t buộc. Mơn hác nhÁm giúp sinh viên b°ớc đ¿u làm </b>

quen với mơi tr°ßng lÁp trình python, sinh viên thực hián nhiều ví dụ để n¿m rõ h¢n các kỹ tht lÁp trình nhÁm xây dựng āng dụng ch¿y trên nhiều nền tÁng khác

<b>nhau. </b>

<b>- Ý nghĩa và vai trị cÿa mơn hác/mơ đun: </b>

 Ý nghĩa: Python hián là ngôn ngữ lÁp trình phổ biến nhất thế giới. ¯u điểm nổi bÁt cÿa Python là dß hác, dß viết. Khơng những thế, Python cịn có một cộng đãng ng°ßi dùng lớn và há tháng th° vián mã nguãn má đã sộ giúp b¿n hồn thành các dự án cÿa mình nhanh chóng và hiáu quÁ. Cho dù đó là một dự án về phân tích dữ liáu, hác máy, xử lý nh, game, iu khin thit bò, hoc ch Ân gin là tự động hóa các tác vụ trên máy tính cÿa b¿n, thì g¿n nh° b¿n đều có thể tìm thấy các th° vián Python hỗ trợ.

 Vai trị: Mơn hác này áp dụng cho sinh viên ngành Tin hác āng dụng trình độ Cao đẳng.

<b>Māc tiêu cÿa môn hác/mô đun: - VÁ ki¿n thāc: </b>

+ N¿m với kiến thāc lÁp trình h°ớng đái t°ợng với python

<b>- VÁ kỹ năng: </b>

+ - Tổ chāc, xây dựng đ°ợc các ch°¢ng trình theo h°ớng đái t°ợng + - Làm viác đ°ợc với tÁp tin XML

+ - Làm viác đ°ợc với dữ liáu Jason

+ - Xây dựng đ°ợc āng dụng với c¢ sá dữ liáu

<b>- VÁ năng lực tự chÿ và trách nhißm: </b>

 Rèn lun lịng u nghề, t° thế tác phong cơng nghiáp, tính kiên trì, sáng t¿o trong công viác.

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<i>GVBS: Đào Thị Xuân Hường Trang 1 </i>

<b>Ch°¡ng 1. Lập trình h°ớng đối t°ợng </b>

<i>Mục tiêu: Học xong chương này sinh viên có thể </i>

<i>- Tìm hiểu và sử dụng được hướng đối tượng trong ngôn ngữ python </i>

Python là một ngơn ngữ lÁp trình h°ớng đái t°ợng. Do đó với những b¿n đã hác qua C++ ch¿c rÁng đã khá quen thuộc với các khái niám về h°ớng đái t°ợng này. Ch°¢ng này sẽ trình bày s¢ qua về các thuÁt ngữ liên quan đến h°ớng đái t°ợng cùng với các ví dụ minh háa giỳp bn dò hiu hÂn v vn ó trỡnh bày.

<b>1.1. Lớp và đối t°ợng </b>

<b>1.1.1. Một số khái nißm h°ớng đối t°ợng </b>

 Lớp: Một nguyên m¿u đ°ợc đßnh nghĩa bái ng°ßi dùng cho một đái t°ợng mà đßnh nghĩa một tÁp hợp các thuộc tính mà xác đßnh rõ bất kỳ đái t°ợng nào cÿa lớp đó. Các thuộc tính là các thành viên dữ liáu (các biến class và biến instance) và các ph°¢ng thāc đ°ợc truy cÁp thơng qua tốn tử dot (dấu chấm).

 Biến class: Đây là một biến đ°ợc chia sẻ bái tất cÁ các instance (sự thể hián) cÿa một lớp. Các biến class đ°ợc đßnh nghĩa bên trong một lớp nh°ng á bên ngoài bất cā ph°¢ng thāc nào cÿa lớp đó. Biến class khơng đ°ợc sử dụng th°ßng xuyên nh° biến instance.

 Thành viên dữ liáu: Là một biến class hoặc biến instance mà giữ dữ liáu đ°ợc liên kết với một lớp và các đái t°ợng cÿa nó.

 N¿p chãng hàm (overloading): Là phép gán cÿa nhiều h¢n một hành vi tới một hàm cụ thể. Ho¿t động đ°ợc thực hián là đa d¿ng do các kiểu cÿa các đái t°ợng hoặc tham sá liên quan.

 Biến instance: Là một biến đ°ợc đßnh nghĩa bên trong một ph°¢ng thāc và chỉ thuộc sá hữu cÿa instance hián t¿i cÿa một lớp đó.

 Tính kế thừa: Là viác truyền các đặc tr°ng cÿa một lớp cho các lớp khác mà kế thừa từ lớp ban đ¿u.

 Instance: Là một đái t°ợng riêng cÿa một lớp nào đó. Một đái t°ợng obj mà thuộc một lớp Circle là một instance (sự thể hián) cÿa lớp Circle.

 Trình khái t¿o: Là trình t¿o một sự thể hián cÿa một lớp.

 Ph°¢ng thāc: Một lo¿i hàm đặc biát mà đ°ợc đßnh nghĩa trong một ph¿n đßnh nghĩa lớp.

 Đái t°ợng: Một instance duy nhất cÿa một cấu trúc dữ liáu mà đ°ợc đßnh nghĩa bái lớp cÿa nó. Một đái t°ợng gãm các thành viên dữ liáu (biến class và biến instance) và các ph°¢ng thāc.

 N¿p chãng tốn tử: Là phép gán cÿa nhiều h¢n một hàm cho một toán tử cụ thể.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<i>GVBS: Đào Thị Xuân Hường Trang 2 </i>

<b>1.1.2. T¿o các lớp trong Python </b>

Trong Python, lánh class đ°ợc sử dụng để t¿o một lớp mới. Tên cÿa lớp theo ngay sau từ khóa class và đ°ợc theo sau bái dấu hai chấm, nh° sau:

print "Tong so Sinh vien %d" % Sinhvien.svCount def displaySinhvien(self):

print "Ten : ",self.ten, ", Hoc phi: ",self.hocphi

Biến svCount là một biến class có giá trß đ°ợc chia sẻ trong tất cÁ instance cÿa lớp Sinhvien này. Biến này có thể đ°ợc truy cÁp d°ới d¿ng Sinhvien.svCount từ bên trong lớp hoặc bên ngồi lớp.

Ph°¢ng thāc đ¿u tiên __init__() là một ph°¢ng thāc đặc biát, là constructor cÿa lớp hoặc ph°¢ng thāc khái t¿o mà Python gái khi b¿n t¿o một instance mới cÿa lớp này. Khai báo các ph°¢ng thāc khác nh° các hàm thơng th°ßng với exception là tham sá đ¿u tiên cho mỗi ph°¢ng thāc là self. Python thêm tham sá self tới List cho b¿n; b¿n khơng c¿n bao nó khi b¿n gái các ph°¢ng thāc.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<i>GVBS: Đào Thị Xuân Hường Trang 3 </i>

<b>1.1.3. Phân bißt giữa Đối t°ợng (Object) và Lớp (Class): </b>

 Đái t°ợng (Object): có tr¿ng thái và hành vi.

 Lớp (Class): có thể đ°ợc đßnh nghĩa nh° là một template mô tÁ tr¿ng thái và hành vi mà lo¿i đái t°ợng cÿa lớp hỗ trợ. Một đái t°ợng là một thực thể (instance) cÿa một lớp

# instantiate the Car class

toyota = Car("Toyota", "Đß", "Đián")

lamborghini = Car("Lamborghini", "Vàng", "Deisel") porsche = Car("Porsche", "Xanh", "Gas")

# access the class attributes

print("Porsche là {}.".format(porsche.__class__.loaixe)) print("Toyota là {}.".format(toyota.__class__.loaixe))

print("Lamborghini cũng là {}.".format(lamborghini.__class__.loaixe))

# access the instance attributes

print("Xe {} có màu {}. {} là nguyên liáu vÁn hành.".format( toyota.tenxe, toyota.mausac, toyota.nguyenlieu))

print("Xe {} có màu {}. {} là nguyên liáu vÁn hành.".format( lamborghini.tenxe, lamborghini.mausac,lamborghini.nguyenlieu))

print("Xe {} có màu {}. {} là nguyên liáu vÁn hành.".format( porsche.tenxe, porsche.mausac, porsche.nguyenlieu))

<b>K¿t quÁ trÁ vÁ sẽ là: </b>

Porsche là Ơ tơ. Toyota là Ơ tơ.

Lamborghini cũng là Ơ tơ.

Xe Toyota có màu Đß. Đián là ngun liáu vÁn hành.

Xe Lamborghini có màu Vàng. Deisel là nguyên liáu vÁn hành. Xe Porsche có màu Xanh. Gas là nguyên liáu vÁn hành.

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<i>GVBS: Đào Thị Xuân Hường Trang 4 </i>

Ch°¢ng trình trên t¿o một lớp Car, sau đó xác đßnh các thuộc tính, đặc điểm cÿa đái t°ợng. Chúng ta truy cÁp thuộc tính class bÁng cách sử dụng __class __.loaixe. Các thuộc tính lớp đ°ợc chia sẻ cho tất cÁ các cá thể cÿa lớp.T°¢ng tự, chúng ta truy cÁp các thuộc tính instance bÁng cách sử dụng toyota.tenxe, toyota.mausac và toyota.nguyenlieu.Tuy nhiên, các thuộc tính instance là khác nhau cho mỗi cá thể cÿa một lớp.

<b>1.1.4. So sánh class cha và class con </b>

<b>Ví dā: T¿o mßt class con cho từng thành phần: </b>

species = "Canis familiaris"

def __init__(self, name, age): self.name = name

self.age = age def __str__(self):

return f"{self.name} is {self.age} years old"

def speak(self, sound):

return f"{self.name} says {sound}"

<b>L°u ý: Để t¿o một class con, b¿n t¿o class mới bÁng tên riêng cÿa nó, rãi nhÁp tên class </b>

cha vào trong dấu ngoặc đ¢n. Thêm dịng sau vào file dog.py để t¿o 3 class con mới cho class Dog:

Các phiên bÁn cÿa lớp con kế thừa tất cÁ các thuộc tính và ph°¢ng thāc cÿa lớp cha:

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<i>GVBS: Đào Thị Xuân Hường Trang 5 </i>

<small>'Jim says Woof'</small>

Để xác đßnh class một đái t°ợng đ°ợc cung cấp thuộc về, b¿n có thể dùng type() sau:

 Điểm c¿n ghi nhớ về class

 Class đ°ợc t¿o bái class keyword (từ khóa).  Thuộc tính là biến thuộc về class.

 Thuộc tính ln cơng khai và có thể đ°ợc truy cÁp bÁng tốn tử (.). Ví dụ: Myclass.Myattribute

<b>1.1.5. T¿o Instance trong Python: </b>

Để t¿o các instance cÿa một lớp, b¿n gái lớp này bái sử dụng tên lớp và truyền vào bất kỳ tham sá nào mà ph°¢ng thāc __init__ cÿa nó chấp nhÁn.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<i>GVBS: Đào Thị Xuân Hường Trang 6 </i>

<b>Truy cÁp các thc tính trong Python: Truy cÁp các thuộc tính cÿa đái t°ợng bái sử </b>

dụng tốn tử dot (dấu chấm) với đái t°ợng. Biến class sẽ đ°ợc truy cÁp bái sử dụng tên lớp nh° sau:

print "Tong so Sinh vien %d" % Sinhvien.svCount

print "Tong so Sinh vien %d" % Sinhvien.svCount def displaySinhvien(self):

print "Ten : ",self.ten, ", Hoc phi: ",self.hocphi "Lenh nay tao doi tuong dau tien cua lop Sinhvien" sv1 = Sinhvien("Hoang", 4000000)

"Lenh nay tao doi tuong thu hai cua lop Sinhvien" sv2 = Sinhvien("Huong",4500000)

print "Tong so Sinh vien %d" % Sinhvien.svCount

<b>K¿t quÁ: </b>

Ten Hoang Hoc phi: 4000000 Ten Huong Hoc phi: 4500000

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<i>GVBS: Đào Thị Xuân Hường Trang 7 </i>

Tong so Sinh vien 2

<b>1.1.6. Thêm, xóa, hoặc sửa đổi các thuộc tính cÿa các lớp và đối t°ợng t¿i bất cā thời điểm nào. </b>

<b>Ví dā: </b>

<small>sv1.tuoi =21 # Them mot thuoc tinh 'tuoi'.sv1.tuoi =20 # Sua doi thuoc tinh 'tuoi'.del sv1.tuoi # Xoa thuoc tinh 'tuoi'.</small>

Thay vì sử dụng các lánh chính thāc để truy cÁp các thuộc tính, b¿n có thể sử dụng các hàm sau:

 Hàm getattr(obj, name[, default]) : Để truy cÁp thuộc tính cÿa đái t°ợng.  Hàm hasattr(obj,name) : Để kiểm tra xem một thuộc tính có tãn t¿i hay khơng.  Hàm setattr(obj,name,value) : Để thiết lÁp một thuộc tính. Nếu thuộc tính

khơng tãn t¿i, thì nó sẽ đ°ợc t¿o.

 Hàm delattr(obj, name) : Để xóa một thuộc tính.

<b>Ví dā: </b>

hasattr(sv1,'tuoi') # Tra ve true neu thuoc tinh 'tuoi' ton tai

getattr(sv1, 'tuoi') # Tra ve gia tri cua thuoc tinh 'tuoi'

setattr(sv1,'tuoi',20)# Thiet lap thuoc tinh 'tuoi' la 20

delattr(sv1, 'tuoi') # Xoa thuoc tinh 'tuoi'

 Các thuộc tính đã có sẵn cho lớp trong Python:

Mỗi lớp Python đều giữ các thuộc tính đã đ°ợc xây dựng sẵn sau và chúng có thể đ°ợc truy cÁp bái sử dụng toán tử dot (dấu chấm .) nh° bất kỳ thuộc tính khác:

 __dict__: Là Dictionary chāa namespace cÿa lớp.

 __doc__: Đ°ợc sử dụng để truy cÁp Documentation String cÿa lớp nếu có.  __name__: Là tên lớp.

 __module__: Là tên Module trong đó lớp đ°ợc đßnh nghĩa. Thuộc tính là __main__ trong chế độ t°¢ng tác.

 __bases__: Là một Tuple chāa các lớp c¢ sá.

<b>Vái láp Sinhvien trên, chúng ta sẽ thử truy cÁp tất cÁ các thc tính này. </b>

class Sinhvien:

'Class co so chung cho tat ca sinh vien' svCount = 0

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<i>GVBS: Đào Thị Xuân Hường Trang 8 </i>

def __init__(self, ten, hocphi): self.ten = ten

self.hocphi = hocphi Sinhvien.svCount += 1 def displayCount(self):

print "Tong so Sinh vien %d" % Sinhvien.svCount def displaySinhvien(self):

print "Ten : ",self.ten, ", Hoc phi: ",self.hocphi print "Sinhvien.__doc__:",Sinhvien.__doc__ print "Sinhvien.__name__:",Sinhvien.__name__ print "Sinhvien.__module__:", Sinhvien.__module__ print "Sinhvien.__bases__:",Sinhvien.__bases__ print "Sinhvien.__dict__:",Sinhvien.__dict__ Kết quÁ:

Sinhvien.__doc__: Class co so chung cho tat ca sinh vien Sinhvien.__name__: Sinhvien

Sinhvien.__module__: __main__ Sinhvien.__bases__: ()

Sinhvien.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0xb7c84994>, 'svCount': 2,

'displaySinhvien': <function displaySinhvien at 0xb7c8441c>, '__doc__': 'Class co so chung cho tat ca sinh vien',

'__init__': <function __init__ at 0xb7c846bc>}

<b>1.1.7. Hÿy đối t°ợng (Trình dọn rác) trong Python: </b>

Python sẽ hÿy các đái t°ợng mà không c¿n đến nữa (các kiểu đã đ°ợc xây dựng sẵn hoặc instance cÿa lớp) một cách tự động để giÁi phóng khơng gian bộ nhớ. Tiến trình này đ°ợc gái là Garbage Collection đ°ợc thực hián bái trình dán rác Garbage Collector. Trình dán rác cÿa Python ch¿y trong khi thực thi ch°¢ng trình và đ°ợc kích ho¿t khi sá tham chiếu cÿa một đái t°ợng tiến về 0. Sá tham chiếu cÿa một đái t°ợng thay đổi khi sá alias mà trß tới nó thay đổi.

Sá tham chiếu cÿa một đái t°ợng tăng khi nó đ°ợc gán một tên mới hoặc đ°ợc đặt trong một container (chẳng h¿n nh° List, Tuple, Dictionary). Sá tham chiếu cÿa một đái t°ợng

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<i>GVBS: Đào Thị Xuân Hường Trang 9 </i>

giÁm khi nó bß xóa với lánh del, tham chiếu cÿa nó đ°ợc tái gán, hoặc tham chiếu cÿa nó thốt ra khßi ph¿m vi. Khi sá tham chiếu cÿa một đái t°ợng tiến về 0, thì Python thu thÁp nó một cách tự động.

<b>Ví dā: </b>

a = 40 # Tao doi tuong <40>

b = a # Tang so tham chieu cua <40>

c =[b] # Tang so tham chieu cua <40>

del a # Giam so tham chieu cua <40>

b = 100 # Giam so tham chieu cua <40>

c[0] =-1 # Giam so tham chieu cua <40>

Th°ßng thì chúng ta khơng chú ý khi trình dán rác hÿy một instance và giÁi phóng bộ nhớ. Nh°ng một lớp có thể triển khai ph°¢ng thāc đặc biát là __del__(), đ°ợc gái là một destructor, mà đ°ợc triáu hói khi instance l chun bò c hy. PhÂng thc này có thể đ°ợc sử dụng để xóa bất kỳ nguãn bộ nhớ nào đ°ợc sử dụng bái một instance.

<b>Ví dā: __del__() destructor này in tên lớp cÿa một instance mà chuÁn bß đ°ợc hÿy. </b>

class Point:

def __init( self, x=0, y=0): self.x = x

self.y = y def __del__(self):

class_name = self.__class__.__name__ print class_name,"destroyed"

pt1 = Point()pt2 = pt1 pt3 = pt1

print id(pt1), id(pt2), id(pt3)# in id cua doi tuong

del pt1 del pt2 del pt3

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<i>GVBS: Đào Thị Xuân Hường Trang 10 </i>

<b>K¿t quÁ </b>

3083401324 3083401324 3083401324 Point destroyed

<i><b>Chú ý:</b></i><b> Một cách lý t°áng nhất là nên đßnh nghĩa các lớp trong file riêng biát, sau đó </b>

nên import chúng trong file ch°¢ng trình chính bái sử dụng lánh import.

def dungxe(self, mucdich):

return "{} đang dừng xe để {}".format(self.tenxe,mucdich) def chayxe(self):

return "{} đang ch¿y trên đ°ßng".format(self.tenxe) def nomay(self):

return "{} đang nổ máy".format(self.tenxe)

# instantiate the Car class

toyota = Car("Toyota", "Đß", "Đián")

lamborghini = Car("Lamborghini", "Vàng", "Deisel") porsche = Car("Porsche", "Xanh", "Gas")

# call our instance methods

print(toyota.dungxe("n¿p đián")) print(lamborghini.chayxe()) print(porsche.nomay()) kết quÁ

Toyota đang dừng xe để n¿p đián Lamborghini đang ch¿y trên đ°ßng

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

<i>GVBS: Đào Thị Xuân Hường Trang 11 </i>

Porsche đang nổ máy

à ví dụ này, có ba ph°¢ng thāc là dungxe(), chayxe() và nomay(). Chúng đ°ợc gái là ph°¢ng thāc instance bái vì chúng đ°ợc gái trên một đái t°ợng instance (toyota, lamborghini, porsche).

<b>1.2.1. Ghi đè ph°¡ng thāc trong Python: </b>

Chúng ta có thể ghi đè các ph°¢ng thāc cÿa lớp cha. Một trong các lý do để thực hián viác ghi đè ph°¢ng thāc cÿa lớp cha là b¿n mn có tính năng khác biát hoặc đặc biát trong lớp con.

<b>Ví dā: </b>

class Parent: # dinh nghia lop cha

def myMethod(self):

print 'Goi phuong thuc cua lop cha' class Child(Parent):# dinh nghia lop con

def myMethod(self):

print 'Goi phuong thuc cua lop con' c = Child() # instance cua lop con

c.myMethod() # lop con goi phuong thuc duoc ghi de

<b>K¿t quÁ là: </b>

Goi phuong thuc cua lop con

<b>1.2.2. N¿p chồng ph°¡ng thāc trong Python: </b>

BÁng d°ới đây liát kê một sá tính năng chung mà b¿n có thể ghi đè trong các lớp riêng

<b>STT Ph°¡ng thāc, Miêu tÁ và Lãi gái m¿u </b>

1 <b>__init__ ( self [,args...] ) </b>

Là constructor (với bất kỳ tham sá tùy ý nào)

<i>Lßi gái m¿u : obj = tenLop(args) </i>

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<i>GVBS: Đào Thị Xuân Hường Trang 12 </i>

2 <b>__del__( self ) </b>

Là destructor, xóa một đái t°ợng

<i>Lßi gái m¿u : del obj </i>

3 <b>__repr__( self ) </b>

Biểu dißn chuỗi có thể °ớc l°ợng

<i>Lßi gái m¿u : repr(obj) </i>

4 <b>__str__( self ) </b>

Biểu dißn chuỗi có thể in đ°ợc

<i>Lßi gái m¿u : str(obj) </i>

5 <b>__cmp__ ( self, x ) </b>

So sánh đái t°ợng

<i>Lßi gái m¿u : cmp(obj, x) </i>

GiÁ sử chúng ta đã t¿o một lớp Vector để biểu dißn các vector hai chiều. Điều gì xÁy ra khi sử dụng tốn tử cộng (+) để cộng chúng? Có thể nói vui rÁng, lúc đó Python sẽ la hét vào mặt b¿n.

Tuy nhiên, chúng ta cú th ònh ngha phÂng thc __add_ trong lp cÿa b¿n để thực hián phép cộng vector và sau đó phép cộng vector sẽ vÁn hành nh° chúng ta mong đợi.

<b>1.2.3. N¿p chồng toán tử trong Python Ví dā: </b>

class Vector:

def __init__(self, a, b): self.a = a

self.b = b def __str__(self):

return 'Vector (%d, %d)' %(self.a,self.b) def __add__(self,other):

return Vector(self.a + other.a,self.b + other.b)

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<i>GVBS: Đào Thị Xuân Hường Trang 13 </i>

v1 = Vector(2,10)v2 = Vector(5,-2)print v1 + v2

<b>K¿t quÁ là: </b>

<b>1.2.4. Ẩn dữ lißu (Data Hiding) trong Python </b>

Các thuộc tính cÿa một đái t°ợng có thể hoặc khơng thể là nhìn thấy với bên ngồi ph¿n đßnh nghĩa lớp. B¿n c¿n đặc tên các thuộc tính với một tiền tá là hai dấu g¿ch d°ới, và sau đó các thuộc tính này sẽ khơng là nhìn thấy với bên ngồi.

<b>Ví dā: </b>

class JustCounter: __secretCount = 0 def count(self):

self.__secretCount += 1 print self.__secretCount counter = JustCounter()counter.count()

print counter.__secretCount

<b>K¿t quÁ là: </b>

1 2

Traceback (most recent call last): File "test.py", line 12,in <module> print counter.__secretCount

AttributeError:JustCounter instance has no attribute '__secretCount'

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

<i>GVBS: Đào Thị Xuân Hường Trang 14 </i>

Python bÁo vá các thành viên đó bÁng cách thay đổi nội t¿i tên để bao tên lớp. Chúng có thể truy cÁp các thuộc tính này d°ới d¿ng nh° doi_tuong._tenLop__tenThuocTinh. Nếu chúng ta thay thế dòng cuái cùng nh° sau:

print counter._JustCounter__secretCountKết quÁ là:

<small>1 2 2 </small>

à ví dụ này, khái t¿o class Computer, sử dụng __init __() để l°u trữ giá bán tái đa cÿa máy tính. Nh°ng sau khi sử dụng, nếu chúng ta có nhu c¿u sửa đổi giá, tuy nhiên không thể thay đổi theo cách bình th°ßng vì Python đã coi __maxprice là thuộc tính private. VÁy nên để thay đổi giá trß, ta sử dụng hàm setter setMaxPrice().

<b>1.3. Kế thừa </b>

Kế thừa là khÁ năng cÿa một class để lấy hoặc kế thừa các thuộc tính từ một lớp khác. Lớp d¿n xuất các thuộc tính đ°ợc gái là lớp d¿n xuất hoặc lớp con và lớp mà từ đó các thuộc tính đ°ợc d¿n xuất đ°ợc gái là lớp c¢ sá hoặc lớp cha. Lợi ích cÿa viác thừa kế là:

+ Nó thể hián tát các mái quan há t¿i thế giới thực.

+ Nó cung cấp khÁ năng tái sử dụng code. Chúng ta không phÁi viết l¿i code nhiều l¿n. Ngồi ra, nó cũng cho phép lÁp trình viên thêm nhiều tính năng h¢n vào class mà khơng c¿n chỉnh sửa nó.

+ Về bÁn chất, nó có tính chất b¿c c¿u. Điều đó có nghĩa nếu class B kế thừa class A khác, thì tất cÁ class phụ cÿa B sẽ tự động kế thừa A.

+ Kế thừa theo thā bÁc: Kế thừa á cấp độ thā bÁc cho phép nhiều lớp d¿n xuất kế thừa các thuộc tính từ một lớp cha.

+ Đa kế thừa: Kế thừa nhiều cấp cho phép một lớp d¿n xuất kế thừa các thuộc tính từ nhiều lớp c¢ sá.

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<i>GVBS: Đào Thị Xuân Hường Trang 15 </i>

+ Thay vì b¿t đ¿u viết code cho một lớp mới, b¿n có thể t¿o một lớp bÁng viác kế thừa nó từ một lớp đã tãn t¿i tr°ớc đó bÁng cách liát kê lớp cha trong cặp dấu ngoặc đ¢n sau tên lớp mới.

Lớp con kế thừa các thuộc tính cÿa lớp cha cÿa nó, và b¿n có thể sử dụng các thuộc tính nh° thể là chúng đã đ°ợc đßnh nghĩa trong lớp con đó. Một lớp con cũng có thể ghi đè các thành viên dữ liáu và các ph°¢ng thāc từ lớp cha.

<b>Ví dā: </b>

class Parent: # dinh nghia lop cha

parentAttr = 100 def __init__(self):

print "Goi constructor cua lop cha" def parentMethod(self):

print 'Goi phuong thuc cua lop cha' def setAttr(self, attr):

Parent.parentAttr = attr def getAttr(self):

print "Thuoc tinh cua lop cha :",Parent.parentAttr class Child(Parent):# dinh nghia lop con

def __init__(self):

print "Goi constructor cua lop con" def childMethod(self):

print 'Goi phuong thuc cua lop con' c = Child() # instance cua lop con

c.childMethod() # lop con goi phuong thuc cua no

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<i>GVBS: Đào Thị Xuân Hường Trang 16 </i>

c.parentMethod() # goi phuong thuc cua lop cha

c.setAttr(200) # tiep tuc goi phuong thuc cua lop cha

c.getAttr() # tiep tuc goi phuong thuc cua lop cha

kết quÁ

Goi constructor cua lop con Goi phuong thuc cua lop con Goi phuong thuc cua lop cha Thuoc tinh cua lop cha :200

<b>Theo cách t°¡ng tự, ta có thể k¿ thừa mßt láp từ nhiÁu láp cha nh° sau: class A: # dinh nghia lop A</b>

def __init__(self, hangxe, tenxe, mausac):

# Lớp Car có 3 thuộc tính: tenxe, mausac, hang xe

self.hangxe = hangxe self.tenxe = tenxe self.mausac = mausac

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<i>GVBS: Đào Thị Xuân Hường Trang 17 </i>

# ph°¢ng thāc

def chayxe(self):

print ("{} đang ch¿y trên đ°ßng".format(self.tenxe)) def dungxe(self, mucdich):

print ("{} đang dừng xe để {}".format(self.tenxe, mucdich))

# Lớp Toyota má rộng từ lớp Car.

def __init__(self, hangxe, tenxe, mausac, nguyenlieu): # Gái tới constructor cÿa lớp cha (Car)

# để gán giá trß vào thuộc tính cÿa lớp cha.

super().__init__(hangxe, tenxe, mausac) self.nguyenlieu = nguyenlieu

# Kế thừa ph°¢ng thāc cũ

def chayxe(self):

print ("{} đang ch¿y trên đ°ßng".format(self.tenxe)) # Ghi đè (override) ph°¢ng thāc cùng tên cÿa lớp cha.

def dungxe(self, mucdich):

print ("{} đang dừng xe để {}".format(self.tenxe, mucdich)) print ("{} ch¿y bÁng {}".format(self.tenxe, self.nguyenlieu)) # Bổ sung thêm thành ph¿n mới

def nomay(self):

print ("{} đang nổ máy".format(self.tenxe))

toyota1 = Toyota("Toyota", "Toyota Hilux", "Đß", "Đián") toyota2 = Toyota("Toyota", "Toyota Yaris", "Vàng", "Deisel") toyota3 = Toyota("Toyota", "Toyota Vios", "Xanh", "Gas") toyota1.dungxe("n¿p đián")

toyota2.chayxe() toyota3.nomay()

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<i>GVBS: Đào Thị Xuân Hường Trang 18 </i>

 Khai báo constructor mới để gán giá trß vào thuộc tính cÿa lớp cha. Hàm super() đāng tr°ớc ph°¢ng thāc __init __ để gái tới nội dung __init __ cÿa Car.

 Class Toyota kế thừa hàm chayxe() và dungxe() cÿa class Car đãng thßi sửa đổi một hành vi thể hián á ph°¢ng thāc dungxe(). Sau đó lớp con bổ sung thêm thành ph¿n mới là nomay() để má rộng kế thừa.

def dungxe(self):

print("Toyota dừng xe để n¿p đián") def nomay(self):

print("Toyota nổ máy bÁng hộp sá tự động")

def dungxe(self):

print("Porsche dừng xe để b¢m xăng") def nomay(self):

print("Porsche nổ máy bÁng hộp sá c¢")

# common interface

def kiemtra_dungxe(car): car.dungxe()

# instantiate objects

toyota = Toyota() porsche = Porsche()

# passing the object

kiemtra_dungxe(toyota) kiemtra_dungxe(porsche)

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<i>GVBS: Đào Thị Xuân Hường Trang 19 </i>

à ví dụ này, chúng ta vừa t¿o hai lớp Toyota và Porsche, cÁ hai lớp đều có ph°¢ng thāc dungxe(). Tuy nhiên hàm cÿa chúng khác nhau. Ta sử dụng tính đa hình để t¿o hàm chung cho hai lớp, đó là kiemtra_dungxe(). Tiếp theo, chúng ta truyền đái t°ợng toyota và porsche vào hàm vừa t¿o, và ta lấy đ°ợc kết quÁ nh° này:

Toyota dừng xe để n¿p đián Porsche dừng xe để b¢m xăng

<b>1.4.2. Đóng gói (Encapsulation) </b>

Sử dụng OOP trong Python, chúng ta có thể h¿n chế quyền truy cÁp vào tr¿ng thái bên trong cÿa đái t°ợng. Điều này ngăn chặn dữ liáu bß sửa đổi trực tiếp, đ°ợc gái là đóng gói. Trong Python, chúng ta biểu thß thuộc tính private này bÁng cách sử dụng dấu g¿ch d°ới làm tiền tá: <_= hoặc <__<.

def __init__(self): self.__maxprice = 900

def sell(self):

print("Giá bán sÁn phÁm là: {}".format(self.__maxprice)) def setMaxPrice(self, price):

self.__maxprice = price c = Computer()

<b>Màn hình hiển thß k¿t q: </b>

Giá bán sÁn phÁm là: 900 Giá bán sÁn phÁm là: 900 Giá bán sÁn phÁm là: 1000

<b>Bài tập có h°ớng dẫn. </b>

<b>Bài tÁp 1. GiÁi ph°¢ng trình bÁc nhất </b>

from thuvien.XL_PhuongTrinhBacNhat import *

a,b=eval(input('Nhap he so a,b: '))

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<i>GVBS: Đào Thị Xuân Hường Trang 20 </i>

xlPTBachNhat = XL_PhuongTrinhBachNhat(a,b) Nghiem=xlPTBachNhat.TimNghiem()

print(XL_PTBHai.a)

setattr(XL_PTBHai,'a',123)

<b>Bài tÁp 3. Viết ch°¢ng trình qn lý các CD(Cơng Đồn) nh° sau </b>

Ng°ßi dùng l¿n l°ợt nhÁp thơng tincÿa các CD, ch°¢ng trình sẽ qn lý thơng tin các CD này và in ra danh sách các CD kèm theo tổng sá tiền cÿa các CD

from thuvien.XL_CD import * tt=1

DSCD=[] while tt==1:

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<i>GVBS: Đào Thị Xuân Hường Trang 21 </i>

TenCD=input('Nhap Ten CD\t') TenCaSi=input('Nhap Ten ca si\t') SoBaiHat=int(input('Nhap Bai hat\t')) GiaTien=eval(input('Nhap Gia tien\t'))

cd = XL_CD(TenCD,TenCaSi,SoBaiHat,GiaTien) DSCD.append(cd)

tt=int(input('NHap so 1 de tiep tuc')) tongtien=0

for cd in DSCD: print(cd.TenCD) print(cd.TenCaSi) print(cd.SoBaiHat) print(cd.GiaTien)

print('=============================================') tongtien+=cd.GiaTien

print("Tong tien : " + str(tongtien))

Giao dßch tiền tá: Mã giao dßch, ngày giao dòch (ngy/thỏng/nm), t giỏ (cng l Ân giỏ), sỏ l°ợng, lo¿i tiền tá có 3 lo¿i:USD, EUR, AUD, lo¿i giao dßch mua/bán. Thành tiền đ°ợc tính nh° sau:

 Nếu lo¿i giao dßch là <mua=thì: thành tiền = sá l°ợng * tÿ giá

 Nếu lo¿i giao dßch là <bán= thì: thành tiền = (sá l°ợng * tÿ giá)* 1.05

<b>Yêu cầu: </b>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<i>GVBS: Đào Thị Xuân Hường Trang 22 </i>

1. T¿o lớp GiaoDichvới các thuộc tính và ph°¢ng thāc chung (giao dßch vàng cũng là giao dßch).

2. T¿o lớp GiaoDichTienTekế thừa từ lớp GiaoDichvới các thuộc tính riêng và ph°¢ng thāc c¿n thiết.

3. NhÁp xuất danh sách các giao dßch. 4. Tính tổng sá l°ợng cho từng lo¿i. 5. Tính tổng thànhtiền cho từng lo¿i

<b>Bài tÁp 2. Tính chu vi & dißntích các hình (abstract) </b>

Viết ch°¢ng trình tính chu vi và đián tích cÿa một sá hình nh° sau: + Hình trịn

+ Hình chữ nhÁt + Hình tam giác

<b>Bài tÁp 3. Viết ch°¢ng trình qn lý sinh viên trong Python. Mỗi đái t°ợng sinh viên </b>

có các thuộc tính sau: id, tên, giới tính, tuổi, điểm tốn, điểm lý, điểm hóa, điểm trung bình và hác lực.

Id là mã sinh viên tự động tăng.

Điểm trung bình là giá trß trung bình cÿa 3 mơn tốn, lý và hóa. Hác lực đ°ợc tính nh° sau:

Giòi: nu im trung bỡnh ln hÂn hoc bÁng 8.

 Khá: nếu điểm trung bình nhß h¢n 8 và lớn h¢n hoặc bÁng 6.5.

 Trung Bỡnh: nu im trung bỡnh nhò hÂn 6.5 v lớn h¢n hoặc bÁng 5.  Yếu: nếu điểm trung bỡnh nhò hÂn 5.

Yờu cu: to ra mt menu với các chāc năng sau: 1. Thêm sinh viên.

2. CÁp nhÁt thông tin sinh viên bái ID. 3. Xóa sinh viên bái ID.

4. Tìm kiếm sinh viên theo tên.

5. S¿p xếp sinh viên theo điểm trung bình (GPA). 6. S¿p xếp sinh viên theo tên.

6. S¿p xếp sinh viên theo ID. 8. Hiển thß danh sách sinh viên.

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<i>GVBS: Đào Thị Xuân Hường Trang 23 </i>

<b>Ch°¡ng 2. Làm vißc với tập tin XML </b>

<i>Mục tiêu: Học xong chương này sinh viên có thể - Tìm hiểu và sử dụng được tập tin XML </i>

<b>2.1. Giới thißu XML </b>

XML (Extensible Markup Language) gái là ngơn ngữ đánh dấu má rộng. XML th°ßng đ°ợc sử dụng để tổ chāc, l°u trữ, truyền gửi dữ liáu giữa các há tháng khác nhau. XML đ°ợc xây dựng dựa trên một tÁp hợp các quy t¿t để mã hóa dữ liáu thành một document với đßnh d¿ng cụ thể. GiÁ sử, chúng ta có 1 file items.xml có nội dung nh° bên d°ới:

<b>items.xml <data> <items> </b>

<b> <item name="item1" price="5">book</item> <item name="item2" price="15">chair</item> <item name="item3" price="20">window</item> </items> </b>

<b></data> </b>

File items.xml đ¢n giÁn gãm các thẻ (tag) lãng nhau. Trong đó, mỗi thẻ item có thuộc tính name và price. Chúng ta sẽ sử dụng file items.xml cho các ví dụ đác file XML trong bài này.

Viác đác và phân tích file XML th°ßng đ°ợc gái là phân tích cú pháp (parsing). Trong Python, chúng ta có thể parsing file XML bÁng cách th° vián:

 BeautifulSoup  ElementTree  Minidom

<b>2.1.1. Khái nißm XML </b>

Cùng giáng nh° JSON, XML là một ngôn ngữ đánh dấu. XML đ°ợc viết t¿t từ tên eXtensible Markup Language, có nghĩa là ngơn ngữ đánh dấu má rộng. Ngôn ngữ này đ°ợc World Wide Web Consortium (W3C) kiến nghß t¿o nên để góp ph¿n xây dựng các API Service. XML có khÁ năng truyền dữ liáu và đác dßch nhiều lo¿i dữ liáu khác nhau.

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<i>GVBS: Đào Thị Xuân Hường Trang 24 </i>

API sẽ trÁ kết quÁ về d¿ng XML để các há tháng khác nhau có thể nói chun với nhau đ°ợc.

Nếu mơ tÁ một cách đ¢n gin hÂn thỡ XML giỏng nh mt mỏy phiờn dòch ngơn ngữ giữa các há tháng với nhau vÁy. Ngồi chc nng thụng dòch, nú cũn giỳp Ân gin húa dữ liáu giữa các platform và há tháng khác nhau. XML cũng có thể đ°ợc dùng nh° một kho l°u trữ các dữ liáu đã trao đổi.

Ví dụ: Có 2 āng dụng, 1 āng dụng đ°ợc xây dựng dựa trên ngơn ngữ lÁp trình Java, āng dụng cịn l¿i thì đ°ợc t¿o nên từ Php. VÁy thì hai āng dụng này hồn tồn khơng thể kết nái với nhau đ°ợc. XML xuất hián nh° một c¿u nái mang đến ngôn ngữ chung cÿa hai āng dụng này giúp chúng thực hián t°¢ng tác với nhau.

<b>2.1.2. Đặc điểm cÿa file XML </b>

XML đ°ợc dùng cho những lo¿i dữ liáu có cấu trúc. XML có cấu t¿o trực quan khá giáng với HTML, nh°ng v¿n khác nhau á nhiều điểm. Có thể nói, XML là c¿u nái để đ°a HTML đến với XHTML.

Tuy XML tãn t¿i nh° một d¿ng văn bÁn nh°ng nó khơng dùng để đác, nó chỉ giúp các há tháng khác nhau có thể thấu hiểu l¿n nhau. Khi ta nh¿c đến đßnh nghĩa đác file XML trong Java thì có nghĩa là dùng XML để mã hóa Java theo ngơn ngữ đánh dấu, chā khơng phÁi má văn bÁn XML ra rãi đác nó lên.

VÁy đßnh d¿ng XML là gì? XML có nhiều cách để đßnh d¿ng khác nhau, d°ới đây là một sá đßnh d¿ng phổ biến mà b¿n có thể biết:

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<i>GVBS: Đào Thị Xuân Hường Trang 25 </i>

RSS và ATOM: Chúng đều dùng để mô tÁ cách làm thế nào mà āng dụng đác xử lý đ°ợc nguãn cấp web.

Microsoft .NET: Há tháng này sẽ sử dụng XML cho các file cấu hình cÿa nó.

Các phiên bÁn kể từ Microsoft Office 2007: Chúng sử dụng XML làm c¢ sá cho cấu trúc tài liáu. Ký hiáu <X= trong đßnh d¿ng tài liáu Word .DOCX cũng xuất phát từ đây. Ngoài ra, XML cũng đ°ợc āng dụng trong Excel (file XLSX) và PowerPoint (file PPTX).

<b>2.1.3. ¯u điểm cÿa file .xml </b>

+ KhÁ năng đác:

Tuy file XML không đ°ợc dùng để đác trực tiếp nh°ng nó v¿n vơ cùng hữu ích đái với các nhà phân tích dữ liáu. Tr°ớc mỗi thơng tin quan tráng trong XML đều có tag name đ¿y đÿ với ký tự text thân thián, phù hợp với khÁ năng đác hiểu cÿa con ng°ßi chā khơng chỉ là ngơn ngữ máy tính khơ khan. Các thơng tin đ°ợc s¿p xếp gán gàng và có tổ chāc nên b¿n có thể nhanh chóng tra cāu khi c¿n thiết. Ngồi ra, ngơn ngữ XML t°¢ng thích với h¿u hết các lo¿i dữ liáu, t¿o nên sự trao đổi nhanh chóng giữa máy tính và file c¿n xử lý.

Tuy nhiên thì ng°ßi dùng cũng c¿n biết đến các kiểu mã hóa text trong XML. Nếu b¿n cịn th¿c m¿c &gt là gì hay &lt là gì thì nó đ°ợc sử dụng nh° cách thay thế 2 ký tự > và <.

+ KhÁ năng t°¢ng thích:

Các file XML mang tính độc lÁp. Điều này có nghĩa là b¿n có thể tùy ý di chuyển chúng và sử dụng á bất cā vß trí, điều kián nào. Điều kián c¿n thiết để sử dụng XML là phÁi có ph¿n mềm xử lý. Khi đó b¿n có thể l°u trữ và truyền đi dữ liáu cÿa mình.

+ KhÁ năng tùy chỉnh:

XML là một lo¿i ngôn ngữ đánh dấu má rộng. Vì thế nó cho phép ng°ßi dùng thi mái t¿o các tag riêng hoặc sử dụng các tag có sẵn từ ng°ßi khác. Điều kián để sử dụng tag ca ngòi khỏc cng rt Ân gin. Bn ch c¿n đÁm bÁo có ngơn ngữ tự nhiên cÿa domain và chúng sá hữu đ¿y đÿ các tính năng c¿n thiết. Sá l°ợng tag đ°ợc t¿o cũng sẽ khơng bß giới h¿n trong XML.

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<i>GVBS: Đào Thị Xuân Hường Trang 26 </i>

<b>2.1.4. Nh°ợc điểm cÿa XML </b>

Có một sá tr°ßng hợp ghi nhÁn sự sai sót trong q trình truyền thơng tin cÿa XML. Tuy nhiên khÁ năng xÁy ra chỉ khoÁng 5-7%, rất thấp. Dù vÁy để ch¿c ch¿n b¿n cũng nên có ph°¢ng pháp rà sốt l¿i thơng tin sau khi tiến hành sử dụng XML .

<b>2.1.5. Āng dụng phổ biến cÿa XML </b>

+ Xuất bÁn web:

XML đ°ợc sử dụng nh° một công cụ thiết kế web. Các dữ liáu đ°ợc t¿o ra và l°u trữ trong XML. Ng°ßi dùng có thể sử dụng chúng trên nhiều máy khác nhau. Để chuyển đổi XML thành những bá cục khác, ví dụ nh° HTML cho các trang web, b¿n chỉ c¿n sử dụng các bộ xử lý chuyển đổi đ¢n giÁn. Nhà phát triển web sẽ sử dụng XML nh° một công cụ hỗ trợ cho ho¿t động chỉnh sửa và thao tác nội dung cho các trang web.

+ Tác vụ web

XML giúp tái °u hóa khÁ năng tìm kiếm và tự động hóa các tác động trên web. Nó cho phép ng°ßi dùng tìm kiếm nhanh chóng một thơng tin nào đó với các kết quÁ rất chuÁn xác. Ví dụ, nếu b¿n tìm kiếm cụm từ Black Widow (một lồi nhán) qua HTML, kết quÁ

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<i>GVBS: Đào Thị Xuân Hường Trang 27 </i>

trÁ về sẽ có cÁ Black 3 màu đen và Widow 3 góa phụ. Nh°ng nếu b¿n tìm kiếm qua XML, kết quÁ đ°ợc thu gán l¿i, thơng tin cơ đáng và chính xác h¢n.

+ Āng dụng chung

Khơng chỉ có thể sử dụng cho web, XML phù hợp với cÁ các ph¿n mềm, há tháng khác nhau. Nó t¿o nên sự liên kết và làm thân thián hóa ph¿n thơng tin cho ng°ßi dùng. Vì thế XML đ°ợc các lÁp trình viên, kỹ s° xây dựng và các kiến trúc s° sử dụng phổ biến hÁng ngày.

<b>2.1.6. Đọc (read) file XML với BeautifulSoup </b>

Th° vián BeautifulSoup hỗ trợ HTML parser (lxml) giúp đác file xml. Để sử dụng lxml parser, chúng ta c¿n cài đặt th° vián này với câu lánh sau:

# install beautifulsoup pip install beautifulsoup4 #install lmxl parser pip install lxml

Các b¿n có thể đác l¿i bài Cài đặt Python và mơi tr°ßng lÁp trình với Visual Studio Code để biết cách cài đặt các th° vián Python trong Visual Studio Code.

Để đác file xml với lxml, chúng ta thực hián 2 b°ớc: B°ớc 1. Tìm các thẻ (tag) trong xml,

B°ớc 2. Rút trích dữ liáu từ các thẻ (tag).

<b>Ví dā: </b>

from bs4 import BeautifulSoup

<b># reading data in items.xml </b>

with open('items.xml', 'r') as f: data = f.read()

<b># passing data inside the beautifulsoup parser </b>

bs_data = BeautifulSoup(data, "xml") # finding all instances of tag item bs_item = bs_data.find_all('item') print(bs_item)

<b># using find() to get a tag with specified attribute </b>

bs_name = bs_data.find('item', {'name':'item1'}) print(bs_name)

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<i>GVBS: Đào Thị Xuân Hường Trang 28 </i>

<b># extracting the text stored in a tag </b>

text = bs_name.get_text() print(text)

<b># extracting the data stored in a specific attribute of a tag </b>

value = bs_name.get('price') print(value)

<b>K¿t quÁ </b>

[<item name="item1" price="5">book</item>, <item name="item2" price="15">chair</item>, <item name="item3" price="20">window</item>] <item name="item1" price="5">book</item> book 5

<b>2.1.7. Các hàm cÿa BeautifulSoup th°ờng đ°ợc sử dụng để đọc file XML nh°: </b>

 Hàm find_all(): tìm tất cÁ các thẻ (tag) đ°ợc chỉ đßnh.  Hàm find() :tìm một thẻ đ¿u tiên phù hợp với yêu c¿u.  Hàm get_text(): lấy ra text cÿa thẻ.

 Hàm get() :lấy ra giá trß cÿa thuộc tính cÿa một thẻ

<b>Ghi chú: Có thể tìm hiểu thêm cách sử dụng BeautifulSoup t¿i Beautiful Soup </b>

Documentation

<b>2.1.8. Module ElementTree </b>

Cung cấp rất nhiều công cụ để thao tác với file XML. Module ElementTree đ°ợc xây dựng sẵn trong Python nên chúng ta không c¿n cài đặt bất kỳ th° vián nào thêm để sử dụng ElementTree.

Tổ chāc lữu trữ dữ liáu cÿa file XML là một đßnh d¿ng dữ liáu phân cấp nên viác biểu dißn nó bÁng cây sẽ dò dng hÂn rt nhiu. Module ElementTree cung cp cỏc phÂng thc biu diòn ton b ti liỏu XML d°ới d¿ng một cây duy nhất. Viác này rất phù hợp trong thao tác với file XML.

Module ElementTree cung cấp hàm ElementTree.parse() để b¿t đ¿u phân tích cú pháp cÿa file XML. Sau đó, hàm getroot() giúp lấy thẻ root trong file XML. Thẻ root sẽ có các thẻ con đ°ợc đánh index b¿t đ¿u từ 0. Các thẻ con sẽ có thuộc tính attrib để giúp truy xuất các thuộc tính cÿa một thẻ.. Đác (read) file XML với ElementTree

<b>Ví dā: </b>

<b># importing element tree </b>

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

<i>GVBS: Đào Thị Xuân Hường Trang 29 </i>

<b>2.1.9. Đọc (read) file XML với minidom </b>

Module minidom đ°ợc tích hợp sẵn trong Python. Chúng ta chỉ c¿n import xml.dom.minidom để sử dụng module minidom. Module này hỗ trợ hàm parse() để đác file XML. Với minidom, mỗi thẻ (tag) sẽ đ°ợc xem là một đái t°ợng (object). Chúng ta có thể truy cÁp các thuộc tính (attribute) và văn bÁn (text) cÿa một thẻ bÁng cách truy cÁp các thuộc tính cÿa đái t°ợng.

<b>Ví dā: </b>

from xml.dom import minidom

<b># parse file items.xml </b>

file = minidom.parse('items.xml')

<b># use getElementsByTagName() to get tags </b>

items = file.getElementsByTagName('item')

<b># one specific item attribute </b>

print('Value of attribute name of item #2:')

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

<i>GVBS: Đào Thị Xuân Hường Trang 30 </i>

print(items[1].attributes['name'].value)

<b># all attributes of item tags </b>

print('\nAll values of attribute name:') for elem in items:

print(elem.attributes['name'].value)

<b># one specific item's data </b>

print('\nData of item:')

print(items[1].firstChild.data) print(items[1].childNodes[0].data)

<b># all items data </b>

print('\nAll item data:') for elem in items:

print(elem.firstChild.data)

<b>K¿t quÁ </b>

Value of attribute name of item #2: item2

All values of attribute name: item1 item2 item3 Data of item: chair chair All item data: book chair window

Th° vián Python chuÁn cung cấp các Interface hữu ích để làm viác với XML. Hai APIs c¢ bÁn và đ°ợc sử dụng nhiều nhât là SAX và DOM. SAX (viết t¿t cÿa Simple API for XML) là read-only trong khi DOM (viết t¿t cÿa Document Object Model) cho phép t¿o các thay đổi tới XML file.

Ch°¢ng này sẽ giới thiáu về cÁ hai Interface này, nh°ng tr°ớc hết, chúng ta t¿o một XML file đ¢n giÁn có tên là movies.xml để làm input:

<b>2.2. Cấu trúc tập tin XML với SAX APIs </b>

Để t¿o riêng một ContentHandler là lớp con cÿa xml.sax.ContentHandler.

ContentHandler cÿa b¿n sẽ xử lý các tag cụ thể và các thuộc tính cÿa XML. Một đái t°ợng ContentHandler cung cấp các ph°¢ng thāc để xử lý các sự kián parsing khác nhau.

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<i>GVBS: Đào Thị Xuân Hường Trang 31 </i>

Ph°¢ng thāc startDocument và endDocument đ°ợc gái t¿i ph¿n b¿t đ¿u và ph¿n cuái cÿa XML file. Ph°¢ng thāc characters(text) để truyền dữ liáu ký tự cÿa XML thông qua tham sá text.

Đái t°ợng ContentHandler đ°ợc gái t¿i ph¿n b¿t đ¿u và ph¿n cuái cÿa mỗi ph¿n tử. Nếu Parser không trong namespace mode, thì các ph°¢ng thāc startElement(tag, thuoc_tinh) và endElement(tag) đ°ợc gái; nếu khơng thì, các ph°¢ng thāc t°¢ng āng startElementNS và endElementNS đ°ợc gái. à đây, tham sá tag là thẻ và thuoc_tinh là một đái t°ợng Attributes.

Chúng ta tìm hiểu một sá ph°¢ng thāc quan tráng sau để hiểu rõ tiến trình xử lý h¢n:

<b>2.2.1. Ph°¡ng thāc make_parser trong Python </b>

Ph°¢ng thāc sau t¿o một đái t°ợng parser mới và trÁ về nó. Đái t°ợng parser đã đ°ợc t¿o này sẽ là kiểu parser đ¿u tiên mà há tháng tìm thấy.

xml.sax.make_parser( [parser_list] )

Tham sá parser_list là tùy ý, bao gãm một danh sách các parser để sử dụng, tất cÁ phÁi triể Ph°¢ng thāc parse trong Python

Ph°¢ng thāc này t¿o một SAX parser và sử dụng nó để phân tích cú pháp một tài liáu.n khai ph°¢ng thāc make_parser.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

<b>Chi ti¿t tham sß: </b>

 xmlfile: Đây là tên cÿa XML file để đác từ đó.

 contenthandler: Đây phÁi là một đái t°ợng ContentHandler.

 errorhandler: Nếu đ°ợc xác đßnh, thì nó phÁi là một đái t°ợng SAX ErrorHandler.

<b>2.2.2. Ph°¡ng Thāc Parse Trong Python </b>

Ph°¢ng thāc này t¿o một SAX parser và sử dụng nó để phân tích cú pháp một tài liáu.

<b>xml.sax.parse( xmlfile, contenthandler[, errorhandler]) </b>

Chi tiết tham sá:

 Xmlfile: Đây là tên cÿa XML file để đác từ đó.

 Contenthandler: Đây phÁi là một đái t°ợng contenthandler.

 Errorhandler: Nếu đ°ợc xác đßnh, thì nó phÁi là một đái t°ợng SAX errorhandler.

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

<i>GVBS: Đào Thị Xuân Hường Trang 32 </i>

<b>2.2.3. Ph°¡ng Thāc Parsestring Trong Python </b>

Ph°¢ng thāc này cũng dùng để t¿o một SAX parser và để phân tích cú pháp XML string đã cho.

<b>xml.sax.parseString(xmlstring, contenthandler[, errorhandler]) Chi ti¿t vÁ tham sß: </b>

 xmlstring: Là tên cÿa XML string để đác từ đó.

 contenthandler: PhÁi là một đái t°ợng ContentHandler.

 errorhandler: Nếu đ°ợc xác đßnh, thì nó phÁi là một đái t°ợng SAX ErrorHandler.DOM API

self.format = "" self.year = "" self.rating = "" self.stars = "" self.description = ""

<b> # Goi khi mot phan tu bat dau </b>

def startElement(self, tag, attributes): self.CurrentData = tag

if tag == "movie":

print "*****Phim Bo*****" title = attributes["title"] print "Ten Phim:", title

<b> # Goi khi mot phan tu ket thuc </b>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<i>GVBS: Đào Thị Xuân Hường Trang 33 </i>

def endElement(self, tag): if self.CurrentData == "type": print "The loai:", self.type elif self.CurrentData == "format": print "Dinh dang:", self.format elif self.CurrentData == "year": print "Nam:", self.year

elif self.CurrentData == "rating": print "Rating:", self.rating elif self.CurrentData == "stars": print "Dien vien:", self.stars

elif self.CurrentData == "description": print "Gioi thieu:", self.description self.CurrentData = ""

<b> # Goi khi mot ky tu duoc doc def characters(self, content): </b>

if self.CurrentData == "type": self.type = content

elif self.CurrentData == "format": self.format = content

elif self.CurrentData == "year": self.year = content

elif self.CurrentData == "rating": self.rating = content

elif self.CurrentData == "stars": self.stars = content

</div>

×