class <ClassName>:
# Hàm khởi tạo đối tượng
def __init__(self, <var1>, <var2>, ...):
self.<var1> = <var1>
self.<var2> = <var2>
# Các phương thức của class
def <method1>(self, ...):
# Nội dung hàm
# Các phương thức của class
def <method2>(self, ...):
# Nội dung hàm
Để khởi tạo đối tượng, sử dụng cú pháp:
<obj> = <ClassName>(<var1>, <var2>)
Dùng tên class để gọi hàm khởi tạo đối tượng , danh sách các tham số sẽ được chuyển đến cho hàm __init__ của class.
Gọi phương thức của classĐể gọi phương thức của class, sử dụng cú pháp:
<obj>.<class_method>(...)
Đối tượng <obj> sẽ được chuyển thành tham số self trong phần xử lý của phương thức.
Ví dụ:
class Person:
def __init__(self, name, address):
self.name = name
self.address = address
def say_hello(self):
print(f'Xin chào, tên tôi là {self.name}')
def update_address(self, new_address):
self.address = new_address
person = Person('Nguyễn Văn An', 'Hà Nội')
person.say_hello()
person.update_address('TP. HCM')
print(f'{person.name} sống tại {person.address}')
Thừa kế là việc tạo ra một class mới (class con) dựa trên một class đã có (class cha). Class con sẽ có toàn bộ các trường dữ liệu & phương thức của class cha, ngoài ra có thể định nghĩa thêm các trường dữ liệu và phương thức riêng của mình.
Ví dụ:
class Person:
def __init__(self, name, address):
self.name = name
self.address = address
def say_hello(self):
print(f'Xin chào, tên tôi là {self.name}')
def update_address(self, new_address):
self.address = new_address
class Student(Person):
def __init__(self, name, address, course):
super().__init__(name, address)
self.course = course
student = Student('Nguyễn Văn An', 'Hà Nội', 'Py2203')
student.say_hello()
student.update_address('TP. HCM')
Lưu ý: Ở phương thức của class con, muốn gọi đến phương thức cùng tên ở class cha thì sử dụng từ khoá super
Ngoài việc kế thừa các phương thức đã có ở class cha, class con còn có thể sửa lại logic của một phương thức đã có. Việc này gọi là ghi đè (overwrite). Ví dụ:
class Person:
def __init__(self, name, address):
self.name = name
self.address = address
def say_hello(self):
print(f'Xin chào, tên tôi là {self.name}')
def update_address(self, new_address):
self.address = new_address
class Student(Person):
def __init__(self, name, address, course):
super().__init__(name, address)
self.course = course
def say_hello(self):
print(f'Xin chào, tên tôi là {self.name}, học lớp {self.course}')
student = Student('Nguyễn Văn An', 'Hà Nội', 'Py2203')
student.say_hello() # gọi phương thức của class Student
JSON (Javascript Object Encoding) là một chuẩn mã hoá đối tượng thành dữ liệu dạng text phỏng theo cách viết đối tượng của Javascript.
Ngày nay, JSON là chuẩn trao đổi dữ liệu phổ biến (nhất) giữa các hệ thống Backend với Frontend, và cả giữa các hệ thống backend với nhau.
Các kiểu dữ liệu trong JSON khá tương đồng (về mặt cú pháp) với các kiểu dữ liệu trong Python (và Javascript):
Ví dụ: Để gửi đi một danh sách học sinh của một lớp học, dữ liệu được chuyển thành dạng JSON như sau:
[
{
"name": "Nguyễn Văn A",
"date-of-birth": "01/01/2000",
"address": "Hà Nội"
},
{
"name": "Nguyễn Văn B",
"date-of-birth": "02/02/2000",
"address": "TP.HCM"
}
]
Trong Python, thư viện json được dùng để chuyển dữ liệu của Python sang dạng JSON và ngược lại.
Ví dụ:
import json
student_list = [
{'name': 'Nguyễn Văn A', 'date-of-birth': '01/01/2000', 'address': 'Hà Nội'},
{'name': 'Nguyễn Văn B', 'date-of-birth': '02/02/2000', 'address': 'TP.HCM'},
]
student_list_json = json.dumps(student_list) # Chuyển từ Python ➝ JSON
print(student_list_json)
student_list2 = json.loads(student_list_json) # Chuyển từ JSON ➝ Python
for st in student_list2:
print(st['name'], st['date-of-birth'], st['address'])
Base64 là cách mã hoá dữ liệu nhị phân thành text để có thể truyền đi được trong các bản tin chỉ dạng text.
Mã hoá base64 sử dụng 64 kí tự: A-Z, a-z, 0-9 và 2 kí tự + /, tất cả đều là các kí tự text.
Trong Python, thư viện base64 được dùng để mã hoá dữ liệu nhị phân thành base64 và giải mã dữ liệu base64 thành chuỗi byte.
Ví dụ:
import base64
# Mã hoá chuỗi byte thành base64
data = bytes([0, 1, 2, 3, 4])
encoded_data = base64.b64encode(data)
print(encoded_data) # b'AAECAwQ='
# Giải mã base64 thành chuỗi byte
b64_data = b'AAECAwQ='
decoded_data = base64.b64decode(b64_data)
print(list(decoded_data))
Một trong những ứng dụng của base64 là để truyền dữ liệu ảnh (dạng nhị phân) trong web-service.
CSV là loại file dùng để lưu các bảng dữ liệu (tương tự excel) nhưng sử dụng format dạng text.
Cấu trúc của file CSV khá đơn giản: mỗi bản ghi tương ứng với một dòng của file, trong một dòng, các trường dữ liệu ngăn cách nhau bởi kí tự phân chia (thường là dấu phảy).
Ví dụ, bảng điểm của một lớp học lưu dưới dạng CSV có dạng như sau:
Họ tên,Điểm hệ số 1,Điểm hệ số 2, Điểm hệ số 3
Nguyễn Văn A,7,8,7
Nguyễn Thị B,8,8,9
Nguyễn Thị C,8,8,7
Nguyễn Văn X,5,6,7
Các file CSV có tên mở rộng là '.csv' và có thể mở với các chương trình nhe Excel, Open Office,... để xem bảng dữ liệu trong đó.
Trong Python, việc đọc và ghi dữ liệu từ file CSV được thực hiện nhờ thư viện csv.
Ví dụ:
import csv
# Đọc dữ liệu từ file csv
with open('student_marks.csv', encoding='utf-8') as fi:
reader = csv.reader(fi,delimiter=',')
header_row = next(reader) # Dòng tiêu đề
data_rows = list(reader) # Các dòng dữ liệu
# Ghi dữ liệu vào file csv
with open('output.csv', 'w', newline='', encoding='utf-8') as fo:
writer = csv.writer(fo, delimiter=',')
writer.writerow(header_row) # Ghi dòng tiêu đề
writer.writerows(data_rows) # Ghi các dòng dữ liệu
Web-service là cách trao đổi dữ liệu qua giao thức http. Trong web-service, phía cung cấp dữ liệu được gọi là web-server, phía nhận dữ liệu gọi là web-client. Trong phần này, chúng ta tìm hiểu cách lấy dữ liệu về từ web-server đã có (Python đóng vai trò là web-client).
Để gọi web-service (lấy dữ liệu về từ web-server), nên sử dụng thư viện requests. Thư viện này không có sẵn trong Python mà phải cài đặt thông qua công cụ pip:
Từ cửa sổ command, gõ lệnh:
pip install requests
Sau khi cài đặt xong, có thể dùng thư viện requests để gọi web-service.
Ví dụ: Web-service dự báo thời tiết
Thông tin thời tiết tại các thành phố trên thế giới có thể được lấy từ web-service ở địa chỉ:
http://api.openweathermap.org/data/2.5/weather?id={location_id}&units=metric&appid={appid}
trong đó {location_id} là thành phố cần lấy thông tin, {appid} là key để truy cập service ( được cung cấp sau khi đăng ký (miễn phí) từ trang chủ của openweathermap.org)
Ví dụ, để lấy thông tin thời tiết Hà Nội, sử dụng:
Dùng trình duyệt để lấy dữ liệu trả về từ web-service:
Dữ liệu json trả về ở dạng không có format, để dễ quan sát, có thể copy kết quả sang một số trang web format json, ví dụ: https://jsonbeautifier.org/
Khi dữ liệu được format, có thể nhìn thấy thông tin thời tiết trả về được chứa trong các trường main/(temp, pressure, humidity).
Chương trình sử dụng thư viện request để lấy dữ liệu thời tiết từ web-service:
import requests
appid = 'd6477696b63c2e661af64eead58c11d9'
location_id = '1581129'
url = f"http://api.openweathermap.org/data/2.5/weather?id={location_id}&units=metric&appid={appid}"
result = requests.get(url).json()
print('Nhiệt độ: ', result['main']['temp'], 'độ C')
print('Độ ẩm: ', result['main']['humidity'], '%')
Dòng lệnh lấy dữ liệu từ server về:
result = requests.get(url).json()
Ngoại lệ là các lỗi có thể phát sinh trong quá trình chạy chương trình. Ví dụ:
Khi ngoại lệ xảy ra, nếu không được xử lý, Python sẽ đưa ra thông báo lỗi và dừng chương trình.
Cách xử lý ngoại lệ:
try:
# do something
except:
print("Exception occurred")
Khi có ngoại lệ xảy ra, chương trình sẽ chạy vào block bên dưới except, sau đó chạy tiếp phần còn lại của chương trình
Một đoạn chương trình có thể có nhiều loại ngoại lệ phát sinh, để xử lý riêng cho từng loại ngoại lệ, có thể chỉ định loại ngoại lệ trong dòng except:
try:
# do something
except ErrorType1:
print("Error type 1")
except ErrorType2:
print("Error type 2")
except:
print("Other exception")
Ví dụ:
try:
x = float(input('x: '))
y = float(input('y: '))
z = x/y
except ValueError:
print("Invalid input number")
except ZeroDivisionError:
print("Cannot divide by 0")
Việc viết Unit Test là tương đối quan trọng vì đảm bảo các chức năng cơ bản thực hiện theo đúng logic đã được thiết kế, giảm trừ các lỗi phát sinh trong quá trình phát triển sản phẩm về sau.
Trong Python, việc viết Unit Test thường sử dụng thư viện unittest
, với lớp đối tượng unittest.TestCaseVí dụ:
import unittest
def add(a, b):
return a + b
class TestCase1(unittest.TestCase):
def test1(self):
self.assertEqual(add(1, 2), 3)
def test2(self):
self.assertTrue(add(1, 2) == 3)
self.assertFalse(add(1, 2) > 3)
if __name__ == '__main__':
unittest.main()
Khi chương trình unittest được chạy (unittest.main()), tất cả các phương thức trong các class kế thừa class unittest.TestCase sẽ được kiểm tra. Nếu ngoại lệ xảy ra ở bất kì phương thức nào, kết quả chung của lần test đó sẽ là fail.
Trong các phương thức unittest, thường sử dụng các lệnh assert để đảm bảo kết quả chạy đúng, một số lệnh assert thường dùng:
| Lệnh kiểm tra | Ý nghĩa |
|---|---|
| assertEqual | kiểm tra 2 biểu thức bằng nhau |
| assertNotEqual | kiểm tra 2 biểu thức khác nhau |
| assertGreater | kiểm tra biểu thức 1 lớn hơn biểu thức 2 |
| assertGreaterEqual | kiểm tra biểu thức 1 lớn hơn hoặc bằng biểu thức 2 |
| assertLess | kiểm tra biểu thức 1 nhỏ hơn biểu thức 2 |
| assertLessEqual | kiểm tra biểu thức 1 nhỏ hơn hoặc bằng biểu thức 2 |
| assertTrue | kiểm tra biểu thức có giá trị bằng True |
| assertFalse | kiểm tra biểu thức có giá trị bằng False |
| assertIsNone | kiểm tra biểu thức có giá trị bằng None |
| assertIsNotNone | kiểm tra biểu thức có giá trị khác None |
| assertIsIn | kiểm tra phần tử nằm trong tập giá trị |
| assertIsNotIn | kiểm tra phần tử không nằm trong tập giá trị |
Trong Python có 2 loại thư viện:
Một vấn đề với các thư viện bổ sung (3rd party) là mỗi thư viện lại có nhiều phiên bản, giữa các phiên bản có thể khác nhau về danh sách các hàm/module cung cấp.
Khi một chương trình phụ thuộc vào một thư viện 3rd party, nó thường yêu cầu thư viện đó có phiên bản cố định (hoặc trong một giải , ví dụ >= 3.1, <= 3.5), để tránh các lỗi phát sinh khi thư viện 3rd party thay đổi ở các phiên bản về sau.
Nếu trên một máy có nhiều chương trình cùng chạy, sẽ xảy ra khả năng các chương trình cùng phụ thuộc vào một thư viện 3rd party nhưng với phiên bản khác nhau.
Để giải quyết vấn đề nay, Python cho phép tạo ra các môi trường ảo (Virtual Environment), mỗi môi trường ảo có danh sách thư viện 3rd party riêng.
Tạo mới Virtual Environment:Mở cửa sổ command và thực hiện các lệnh:
mkdir <project_name>
cd <project_name>
python -m venv .
Mỗi lần chạy chương trình trong Virtual Environment, cần kích hoạt bằng lệnh:
cd <path_to_project>
Script\activate
Sau khi thực hiện lệnh activate trên, con trỏ dòng lệnh sẽ xuất hiện kí hiệu (<project_name>) ở đầu:
(<project_name>) C:\...
Để cài đặt thư viện 3rd party trong Virtual Environment, sử dụng lệnh pip như cách cài đặt thư viện cho Python trên hệ thống:
(<project_name>) pip install <module>==<version>
Thư viện sẽ được cài đặt trong thư mục Lib của Virtual Environment, và không ảnh hưởng đến thư mục Lib của Python trên hệ thống.