1. Lập trình hướng đối tượng

Khai báo class trong Python
      
        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

Để 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ế

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
        
      
    

2. Làm việc với JSON

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'])
      
    

3. Làm việc với Base64

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.

4. Làm việc với CSV

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

      
    

5. Gọi web-service với thư viện requests

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()

6. Xử lý ngoại lệ

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")
      
    

7. Unittest

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.TestCase

Ví 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ị

8. Virtual Environment

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 .
Sử dụng Virtual Environment:

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.