--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Python (30) - Tổng kết giai đoạn 1

Bài trước: Python (29) - Dự án kết thúc giai đoạn 1 (3)
-----

28. Tổng kết giai đoạn 1

Vai trò của AI

Vậy là bạn đã hoàn thành được một chặng đường nhỏ đầu tiên của hành trình học Python. Một vài nhận xét, hy vọng có ích cho các bạn:

- Dù có trí tuệ nhân tạo (AI) hỗ trợ trong việc học và làm phần mềm, tuy nhiên, bạn vẫn phải là người sau cùng chịu trách nhiệm về những đoạn mã. Bạn phải đủ trình độ, đủ kiến thức để đánh giá giải pháp do AI tạo ra là ổn hay không?

- Làm sao để có đủ trình độ, đủ kiến thức để đánh giá AI? Không có con đường nào khác ngoài việc bạn phải tự tay làm, tự mình suy nghĩ, tự tìm hiểu xem đoạn mã đó làm gì? Kết quả chạy ra sao? Có rủi ro gì không?

- Vậy AI sẽ là công cụ đắc lực, giúp bạn học nhanh hơn chứ KHÔNG HỌC THAY và KHÔNG LÀM THAY bạn được

Định hướng việc học

Tạm chia xu hướng học của bạn theo 2 hướng:

- Hướng hàn lâm (khai phóng): tìm tòi những cái mới, giải pháp mới, cải tiến các thuật toán để nó chạy hiệu quả hơn, tốt hơn

- Hướng ứng dụng: dùng các công cụ, công nghệ, giải pháp đã có để tạo ra các ứng dụng, sản phẩm phần mềm, đáp ứng được nhu cầu xã hội

Mỗi bạn sẽ có thiên hướng khác nhau giữa Hàn lâm và Ứng dụng, hoặc pha trộn giữa 2 lựa chọn này. Bạn hãy nhờ AI phân tích thêm để biết nên theo hướng nào, cái được cái mất khi theo mỗi hướng

Với điều kiện tại Việt Nam hiện nay (2026), nếu bạn sống, học và làm việc tại Việt Nam, thì theo hướng Ứng dụng vẫn hợp lý hơn.

Định hướng việc làm theo hướng ứng dụng

Dù chọn Python hay một ngôn ngữ lập trình bất kỳ, luôn có một số hướng ứng dụng, bạn có thể thử sức:

- Web

- Mobile

- Game

- Học máy

- Phân tích dữ liệu

- …

Con đường theo học Python còn nhiều nội dung thú vị ở phía trước, mời bạn kiên trì bước tiếp 

-----

Python (29) - Dự án kết thúc giai đoạn 1 (3)

Bài trước: Python (28) - Dự án kết thúc giai đoạn 1 (2)
-----

- Trong hàm hien_thi_bang_diem(danh_sach_lop) ở trên, chúng ta chưa tính được ĐTB MÔN và XẾP LOẠI, nên đã tạm gán giá trị 5.0Trung bình.

- Chúng ta sẽ viết hàm để tính ĐTB MÔN

ĐTB MÔN được tính bằng công thức: 

ĐTB MÔN = (Tổng các điểm tx + gk * 2 + ck * 3) / (số cột điểm tx + 2 + 3)

- Viết hàm tinh_dtb_mon(diem_mon) và hàm xep_loai(dtb) ở phía trên của hàm hien_thi_bang_diem

    except FileNotFoundError:

        return[]


# hàm tính ĐTB MÔN

def tinh_dtb_mon(diem_mon)

    tx = diem_mon.get("tx", [])

    gk = diem_mon.get("gk", 0.0)

    ck = diem_mon.get("ck", 0.0)


    tong_diem = sum(tx) + (gk * 2) + (ck * 3)

    tong_he_so = len(tx) + 2 + 3


    if tong_he_so > 0:

        return round(tong_diem / tong_he_so, 2)

    return 0.0


# hàm xếp loại

def xep_loai(dtb):

    """Xếp loại học lực dựa trên điểm trung bình môn"""

    if dtb >= 8.0:

        return "Tốt"

    elif dtb >= 6.5:

        return "Khá"

    elif dtb >= 5.0:

        return "Đạt"

    else:

        return "Chưa đạt"


# hàm hiển thị danh sách và bảng điểm

def hien_thi_bang_diem(danh_sach_lop):

- Sửa lại hàm hien_thi_bang_diem(danh_sach_lop): thay thế các giá trị gán tạm (dtb = 5.0, xl = "Trung bình") bằng việc gọi 2 hàm vừa viết.

- Chạy lại chương trình, để xem ĐTB MÔN và Xếp loại của lớp đã được cập nhật.

Lập trình chức năng Thêm học sinh mới

Để thêm học sinh mới, bạn cần thực hiện các công việc sau:

- Nhập mã học sinh và họ tên từ bàn phím

- Kiểm tra xem mã học sinh đã tồn tại trong danh_sach_lop hay chưa

- Nếu chưa tồn tại, tạo cấu trúc Dictionary cho học sinh mới, với bộ điểm rỗng {“tx”: [], “gk”: 0.0, “ck”: 0.0} và gắn vào cuối danh_sach_lop

- Bạn mở tập tin main.py và viết hàm them_hoc_sinh(danh_sach_lop) ngay phía dưới hàm main()

# hàm thêm học sinh

def them_hoc_sinh(danh_sach_lop):

    """Thêm một học sinh mới vào danh sách lớp"""

    print("\n--- THÊM HỌC SINH MỚI ---")

    ma_hs = input("Nhập mã học sinh (ví dụ HS004): ").strip()


    if not ma_hs:

        print("Lỗi: Mã học sinh không được để trống!")

        return


    # Kiểm tra xem mã học sinh đã tồn tại chưa

    for hs in danh_sach_lop:

        if hs["ma_hs"].upper() == ma_hs.upper():

            print(f"Lỗi: Mã học sinh '{ma_hs}' đã tồn tại trong danh sách!")

            return


    ho_ten = input("Nhập họ và tên học sinh: ").strip()

    if not ho_ten:

        print("Lỗi: Họ tên không được để trống!")

        return

    

    # Tạo bản ghi học sinh mới

    hoc_sinh_moi = {

        "ma_hs": ma_hs.upper(),

        "ho_ten": ho_ten.title(),

        "diem": {}

    }


    danh_sach_lop.append(hoc_sinh_moi)

    print(f"-> Đã thêm học sinh '{ho_ten}' (Mã: {ma_hs.upper()}) vào danh sách!")

- Cập nhật hàm main(), để gọi chức năng 2:

...

 if lua_chon == "1":

            hien_thi_bang_diem(danh_sach_lop)

        elif lua_chon == "2":

            them_hoc_sinh(danh_sach_lop)

        elif lua_chon == "0":

...

Lập trình chức năng Nhập điểm môn học

Để lập trình chức năng Nhập điểm môn học, bạn cần thực hiện các việc sau:

- Bẫy lỗi nhập điểm (nhap_diem_hop_le): kiểm tra điểm nhập vào, đảm bảo điểm là số thực, nằm trong khoảng 0.0 đến 10.0

- Tìm học sinh theo mã học sinh: cho người dùng nhập mã học sinh, nếu không tìm thấy thì báo lỗi

- Chọn môn học: hiển thị các môn học hợp lệ (Toán, Ngữ văn, Tiếng Anh, KHTN, Lịch sử_Địa lý)

- Nhập điểm: nhập điểm thường xuyên (nếu nhập nhiều điểm, mỗi điểm cách nhau bằng dấu chấm phẩy, giữa kỳ và cuối kỳ

Viết hàm nhap_diem_hop_le()

- Viết hàm ngay sau hàm main()

- Sử dụng khối try…except để yêu cầu nhập lại nếu người dùng nhập chữ hoặc số không nằm trong khoảng [0.0 đến 10.0]

# hàm bẫy lỗi nhập điểm

def nhap_diem_hop_le(prompt):

    """Yêu cầu nhập điểm từ 0.0 đến 10.0, bắt lỗi ValueError nếu nhập sai"""

    while True:

        try:

            diem = float(input(prompt))

            if 0.0 <= diem <= 10.0:

                return diem

            print("Lỗi: Điểm phải nằm trong khoảng 0.0 > 10.0!")

        except ValueError:

            print("Lỗi: Giá trị phải là một số (ví dụ: 6.0)!")

Viết hàm nhap_diem_hoc_sinh()

- Viết hàm nhap_diem_hoc_sinh() ngay sau hàm nhap_diem_hop_le()

# Danh mục các môn học (không thay đổi)(kiểu Set)

MON_HOC = {"Toán", "Ngữ văn", "Tiếng Anh", "KHTN", "Lịch sử_Địa lý"}


# Hàm nhập điểm cho học sinh

def nhap_diem_hoc_sinh(danh_sach_lop):

    """Nhập các loại điểm cho một học sinh, dựa theo mã học sinh"""

    print("\n---NHẬP ĐIỂM MÔN HỌC---")

    ma_hs = input("Nhập mã học sinh cần nhập điểm: ").strip().upper()


    # Tìm học sinh trong danh sách

    hoc_sinh = None

    for hs in danh_sach_lop:

        if hs["ma_hs"].upper() == ma_hs:

            hoc_sinh = hs

            break


    if not hoc_sinh:

        print(f"Lỗi: Không tìm thấy học sinh có mã '{ma_hs}'!")

        return


    print(f"Đang nhập điểm cho học sinh: {hoc_sinh['ho_ten']} ({hoc_sinh['ma_hs']})")

    print(f"Danh sách môn học hợp lệ: {', '.join(MON_HOC)}")

    mon = input("Nhập tên môn học: ").strip()


    if mon not in MON_HOC:

        print("Lỗi: Tên môn học không tồn tại!")

        return


    #Nhập các điểm thường xuyên, cách nhau bởi dấu ;

    print("Nhập các điểm thường xuyên, cách nhau bởi dấu chấm phẩy (;):")

    tx_input = input("Điểm TX: ").strip()

    tx_list = []

    if tx_input:

        for x in tx_input.split(";"):

            try:

                val = float(x.strip())

                if 0.0 <= val <= 10.0:

                    tx_list.append(val)

                else:

                    print(f"Cảnh báo: Điểm '{x}' Không hợp lệ (phải từ 0-10), đã bỏ qua.")

            except ValueError:

                print(f"Cảnh báo: Giá trị '{x}' không phải là số, đã bỏ qua.")


        # Nhập điểm giữa kỳ và cuối kỳ

        gk = nhap_diem_hop_le("Nhập điểm Giữa kỳ: ")

        ck = nhap_diem_hop_le("Nhập điểm Cuối kỳ: ")


        #Cập nhật vào cấu trúc dữ liệu của học sinh

        hoc_sinh["diem"][mon] = {

            "tx": tx_list,

            "gk": gk,

            "ck": ck

        }

        print(f"-> Đã cập nhật điểm môn '{mon}' cho học sinh {hoc_sinh['ho_ten']} thành công!")

- Sửa lại hàm main(), để chạy chức năng nhập điểm:

 print("2. Thêm học sinh mới")

        print("3. Nhập điểm môn học")

        # sau này bạn sẽ thêm các chức năng

elif lua_chon == "2":

            them_hoc_sinh(danh_sach_lop)

        elif lua_chon == "3":

            nhap_diem_hoc_sinh(danh_sach_lop)

        elif lua_chon == "0":

Lập trình chức năng Lưu dữ liệu ra file CSV

- Nếu bạn để ý, ở đầu chương trình, ngay trong hàm main(), chúng ta đã đọc dữ liệu (danh sách và điểm) từ tập tin CSV lưu vào biến danh_sach_lop. Sau đó, chúng ta thực hiện một số thao tác trên danh sách lớp này. Tuy nhiên, danh_sach_lop là một biết đang nằm trên bộ nhớ RAM, nếu tắt máy các thông tin mà chúng ta vừa cập nhật sẽ bị xóa. 

- Để lưu lại lâu dài, các thông tin vừa xử lý, bạn cần ghi thông tin vào đĩa cứng

- Chúng ta sẽ thực hiện lưu dữ liệu ra tập tin CSV

- Chúng ta sẽ viết hàm luu_file_csv(danh_sach_lop) ngay sau hàm main()

# Hàm lưu dữ liệu ra file CSV

def luu_file_csv(danh_sach_lop):

    """Lưu danh sách học sinh và điểm số vào tập tin CSV"""

    try:

        with open(FILE_PATH, mode="w", newline="", encoding="utf-8") as f:

            writer = csv.writer(f)

            writer.writerow(["ma_hs", "ho_ten", "mon", "tx", "gk", "ck"])

            for hs in danh_sach_lop:

                if not hs["diem"]:

                    writer.writerow([hs["ma_hs"], hs["ho_ten"], "", "", "", ""])

                else:

                    for mon, d in hs["diem"].items():

                        tx_str = ";".join(map(str, d.get("tx", [])))

                        writer.writerow([

                            hs["ma_hs"],

                            hs["ho_ten"],

                            mon,

                            tx_str,

                            d.get("gk",""),

                            d.get("ck","")

                        ])

            print("-> Đã lưu dữ liệu thành công vào đĩa cứng!")

    except Exception as e:

        print(f"Lỗi khi lưu file {e}")

- Sửa lại hàm main(), để chạy chức năng nhập điểm:

  print("3. Nhập điểm môn học")

        print("4. Lưu dữ liệu ra file CSV")

        # sau này bạn sẽ thêm các chức năng

...

 elif lua_chon == "3":

            nhap_diem_hoc_sinh(danh_sach_lop)

        elif lua_chon == "4":

            luu_file_csv(danh_sach_lop)

        elif lua_chon == "0":

27.4 Bài tập và câu hỏi

Bài 27a. Dựa trên Dự án mẫu của bài học, bạn hãy tự làm lại toàn bộ dự án, đồng thời hãy tạo một tập tin (trong Microsoft Word, hoặc Google Docs) để ghi chép toàn bộ quá trình làm dự án của bạn. 

Mục đích của việc ghi chép:

- Làm bằng chứng, chứng minh rằng bạn đã tự làm lại dự án

- Qua quá trình ghi chép bạn sẽ trải nghiệm thực sự những khó khăn, những lỗi lập trình, những đoạn mã xử lý kỳ ảo

- Giải pháp AI có thể cung cấp cho bạn, tuy nhiên, làm việc thực sự thì mới thấm và hiểu được mã nguồn, và quy trình làm một dự án lập trình

- Ghi chép làm tài liệu để làm các dự án tiếp theo

- Ghi chép và tự làm nhiều thì quen tay, và lên trình

- Phát triển thêm các chức năng cho ứng dụng này

Bài tập 27b. Bạn có thể tự nghĩ ra, hoặc nhờ AI gợi ý một dự án. Hãy tự mình thực hiện dự án đó. 

Yêu cầu kết quả:

- Sổ tay ghi chép toàn bộ quá trình làm dự án

- Mã nguồn dự án

-----
Bài sau: Python (30) - Tổng kết giai đoạn 1

Python (28) - Dự án kết thúc giai đoạn 1 (2)

Bài trước: Python (27) - Dự án kết thúc giai đoạn 1 (1)
-----

27.3.2 Hướng dẫn làm từng bước Dự án mẫu

Tạo thư mục, tập tin cho dự án

- Tạo thư mục mới, đặt tên theo chuẩn Pascal, tiếng Việt, không dấu, ví dụ QuanLyBangDiemLop7

- Trong thư mục QuanLyBangDiemLop7, tạo tập tin mã nguồn của dự án, ví dụ main.py

Lập trình hàm main()

- Trong main.py, viết hàm main() và chạy thử

- Bạn nên viết mã nguồn bằng IDLE hoặc Notepad để không có gợi ý của trình viết mã, giúp bạn học được nhiều hơn. Sau này, biết nhiều rồi thì mới nên dùng VS Code hoặc một IDE bất kỳ.

[main.py]

def main():

    print("hi")


if __name__ == "__main__":

    main()

- Bạn nên hỏi AI về lệnh if ở đoạn mã trên, để hiểu cách Python gọi hàm main() khi thực thi. Có thể hiểu đơn giản: __name__ là biến ẩn của Python, nó sẽ được gán giá trị là __main__ khi bạn chạy trực tiếp một tập tin .py. Và khi đó, Python sẽ sẽ gọi hàm main() để thực thi.

- Chạy thử đoạn mã trên, bạn sẽ thấy chữ “hi” xuất hiện trên màn hình kết quả, vậy là bạn đã sẵn sàng để lập trình

- Cho xuất hiện menu của chương trình:

[main.py]

def main():

    while True:

        print("\n === QUẢN LÝ BẢNG ĐIỂM HỌC SINH LỚP 7 ===")

        print("1. Xem danh sách & bảng điểm")

        print("2. Thêm học sinh mới")

        # sau này bạn sẽ thêm các chức năng ở đây

        print("0. Thoát chương trình")


        lua_chon = input("Mời bạn chọn chức năng (0-2): ").strip()

        if lua_chon == "1":

            print("Danh sách lớp & bảng điểm")

        elif lua_chon == 2:

            print("Thêm học sinh mới")


        elif lua_chon == "0":

            print("Đã thoát chương trình!")

            break

        else:

            print("Lựa chọn không hợp lệ!")


if __name__ == "__main__":

    main()

- Bạn chạy thử chương trình, nhập các số khác nhau để kiểm tra xem chương trình chạy đúng chưa

Tạo tập tin lưu danh sách lớp

- Việc đầu tiên chúng ta cần làm là: trong thư mục dự án, tạo tập tin để lưu danh sách lớp và điểm của mỗi bạn (đặt tên là bang_diem_lop7.csv)

Tập tin bang_diem_lop7.csv được định dạng theo chuẩn csv:

- Hàng đầu tiên là tiêu đề

- Các hàng tiếp theo là thông tin của học sinh và điểm, mỗi học sinh sẽ có nhiều hàng, mỗi hàng gồm nhiều trường, mỗi trường sẽ cách nhau bằng dấu phẩy (,). Riêng trường điểm thường xuyên (tx), vì có nhiều, nên sẽ dùng dấu chấm phẩy (;) để ngăn cách

Ví dụ:

ma_hs,ho_ten,mon,tx,gk,ck 

HS01,Nguyễn Văn Tèo,Toán,8.0;7.0,7.5,9.0 

HS01,Nguyễn Văn Tèo,Ngữ văn,7.0;6.0,7.0,7.5  

Ở bảng dữ liệu trên, bạn Tèo sẽ có mã số là HS01, có dòng điểm cho môn Toán gồm 2 điểm thường xuyên là 8.0 và 7.0, điểm giữa kỳ (gk) là 7.5 và điểm cuối kỳ (ck) là 9. Và dòng điểm cho môn Ngữ văn.

Bạn hãy chèn nội dung trên vào tập tin  bang_diem_lop7.csv

[bang_diem_lop7.csv]

ma_hs,ho_ten,mon,tx,gk,ck 

HS01,Nguyễn Văn Tèo,Toán,8.0;7.0,7.5,9.0 

HS01,Nguyễn Văn Tèo,Ngữ văn,7.0;6.0,7.0,7.5  

Viết hàm đọc dữ liệu từ tập tin

- Để đọc dữ liệu từ tập tin CSV, cần sử dụng thư viện csv. Chúng ta sẽ thêm lệnh gọi thư viện (import csv) vào đầu tập tin main.py. Đồng thời, chúng ta cũng sử dụng thư viện os để xử lý tập tin. Khai báo hằng FILE_PATH để tiện khi lập trình.

[main.py]

import csv

import os


FILE_PATH = "bang_diem_lop7.csv"

def main():

...

- Trong tập tin main.py, sau hàm def main(), tạo hàm doc_file_csv(), với nội dung sau: sử dụng cấu trúc try…except để bẫy lỗi FileNotFoundError.

[main.py]

        else:

            print("Lựa chọn không hợp lệ!")


# hàm đọc tập tin csv

def doc_file_csv():

    danh_sach_lop = []

    if not os.path.exists(FILE_PATH):

        return danh_sach_lop

    try:

        with open(FILE_PATH, mode="r", encoding="utf-8") as f:

            reader = csv.DictReader(f)

            print("trong doc_file")

            print(reader)

# bạn nên chèn các đoạn mã, để kiểm tra chạy từng bước


    except FileNotFoundError:

        return[]

            

if __name__ == "__main__":

    main()

- Gọi hàm doc_file_csv() trong hàm main(), để chạy và kiểm tra:

 if lua_chon == "1":

            doc_file_csv()

        elif lua_chon == 2:

- Tiếp tục hoàn thành hàm doc_file_csv()

# hàm đọc tập tin csv

def doc_file_csv():

    danh_sach_lop = []

    if not os.path.exists(FILE_PATH):

        return danh_sach_lop

    try:

        with open(FILE_PATH, mode="r", encoding="utf-8") as f:

            reader = csv.DictReader(f)

            students = {}

            for row in reader:

                ma = row["ma_hs"]

                if ma not in students:

                    students[ma] = {"ma_hs": ma, "ho_ten": row["ho_ten"], "diem": {}}

                if row["mon"]:

                    tx = [float(x) for x in row["tx"].split(";") if x]

                    gk = float(row["gk"]) if row["gk"] else 0.0

                    ck = float(row["ck"]) if row["ck"] else 0.0

                    students[ma]["diem"][row["mon"]] = {"tx": tx, "gk": gk, "ck": ck}

            return list(students.values())

- Thêm một đoạn mã nhỏ trong hàm main(), để kiểm tra kết quả chạy của hàm doc_file_csv():

if lua_chon == "1":

            danh_sach_hs = doc_file_csv()

            print(danh_sach_hs)

        elif lua_chon == 2:

Nếu chạy được, chương trình sẽ xuất ra  kết quả là:

[{'ma_hs': 'HS01', 'ho_ten': 'Nguyễn Văn Tèo', 'diem': {'Toán': {'tx': [8.0, 7.0], 'gk': 7.5, 'ck': 9.0}, 'Ngữ văn': {'tx': [7.0, 6.0], 'gk': 7.0, 'ck': 7.5}}}]

...

Tuy nhiên, chức năng số 1 là: hiển thị Danh sách và bảng điểm.

Danh sách và bảng điểm sẽ có dạng như sau:

Tương ứng với nội dung dữ liệu trong tập tin bang_diem_lop7.csv có dạng như sau:

ma_hs,ho_ten,mon,tx,gk,ck

HS001,Nguyễn Văn Tèo,Toán,8.0;7.0,7.5,9.0

HS001,Nguyễn Văn Tèo,Ngữ văn,7.0;6.0,7.0,7.5

HS001,Nguyễn Văn Tèo,Tiếng Anh,9.0;10.0,9.5,9.0

HS002,Trần Thị Tí,Toán,6.0;6.5,6.0,7.0

HS002,Trần Thị Tí,Lịch sử_Địa lý,8.0;8.5,8.0,8.5

HS003,Lê Sửu,,,

Hàm doc_file_csv() đã trả về một List chứa thông tin của tất cả học sinh, cùng với các điểm thành phần. Chúng ta sẽ viết tiếp hàm hien_thi_bang_diem(danh_sach_lop) để hiển thị Danh sách lớp và bảng điểm.

Vì hàm hien_thi_bang_diem(danh_sach_lop) có dùng tới biến danh_sach_lop, nên chúng ta khai báo và gọi hàm doc_file_csv() để có dữ liệu. Đồng thời gọi hàm hien_thi_bang_diem(danh_sach_lop) trong mục chọn 1.

[main.py]

def main():

    danh_sach_lop = doc_file_csv()

    while True:

...

 if lua_chon == "1":

            hien_thi_bang_diem(danh_sach_lop)

        elif lua_chon == 2:

...

Viết hàm  hien_thi_bang_diem(danh_sach_lop) ngay phía dưới hàm doc_file_csv().

[main.py]

    except FileNotFoundError:

        return[]


# hàm hiển thị danh sách và bảng điểm

def hien_thi_bang_diem(danh_sach_lop):

    """Hiển thị Danh sách và bảng điểm"""

    if not danh_sach_lop:

        print("\n Danh sách không có học sinh nào!")

        return

    print("\n" + "=" * 65)

    print(f"{'MÃ HS':<10}{'HỌ VÀ TÊN':<20}{'MÔN':<15}{'ĐTB MÔN':<10}{'XẾP LOẠI'}")

    print("=" * 65)

    for hs in danh_sach_lop:

        print(f"{hs['ma_hs']:<10}{hs['ho_ten']:<20}")

        if not hs["diem"]:

            print(f"{'':<30}(Chưa có điểm)")

        else:

            for mon, d in hs["diem"].items():

                #dtb = tinh_dtb_mon(d) - sẽ viết sau

                #xl = xep_loai(dtb) - sẽ viết sau

                dtb = 5.0

                xl = "Trung bình"

                print(f"{'':<10}{'':<20}{mon:<15}{dtb:<10}{xl}")

        print("-" * 65)

    

if __name__ == "__main__":

- Chạy chương trình để xem kết quả:


-----