Khi làm hồ sơ tốt nghiệp hay thăng hạng, mình thường phải tra bảng quy đổi điểm TOEFL ITP sang bậc của Khung năng lực ngoại ngữ 6 bậc dùng cho Việt Nam. Tra tay thì dễ nhầm ở các mốc biên (499 hay 500?), nên mình viết một hàm Python nhỏ để làm việc này, kèm một hàm kiểm tra hạn dùng của kết quả. Bài dành cho người mới, chỉ cần biết hàm và vòng lặp.

Bảng quy đổi

Mình dùng bảng quy đổi nêu trên một trang giới thiệu khóa luyện thi TOEFL ITP:

Điểm TOEFL ITP Bậc CEFR
450 đến 499 3 B1
500 đến 549 4 B2
550 đến 626 5 C1
627 đến 677 6 C2

Điểm dưới 450 tương ứng các bậc thấp hơn. Quy định có thể thay đổi, nên hãy đối chiếu văn bản hiện hành của nơi nhận hồ sơ trước khi dùng.

Hàm quy đổi

Ý tưởng: lưu bảng thành danh sách các bộ (thấp, cao, bậc, mức), rồi duyệt để tìm khoảng chứa điểm.

from datetime import date BANG_QUY_DOI = [ (450, 499, 3, "B1"), (500, 549, 4, "B2"), (550, 626, 5, "C1"), (627, 677, 6, "C2"), ] def quy_doi_toefl_itp(diem: int): """Trả về (bậc, mức CEFR) hoặc None nếu thấp hơn Bậc 3.""" if not 0 <= diem <= 677: raise ValueError("Điểm TOEFL ITP nằm ngoài khoảng 0-677") for thap, cao, bac, muc in BANG_QUY_DOI: if thap <= diem <= cao: return bac, muc return None 

Thử các mốc biên:

for d in (430, 450, 499, 500, 549, 550, 626, 627, 677): print(d, quy_doi_toefl_itp(d)) # 430 None # 450 (3, 'B1') # 499 (3, 'B1') # 500 (4, 'B2') # 549 (4, 'B2') # 550 (5, 'C1') # 626 (5, 'C1') # 627 (6, 'C2') # 677 (6, 'C2') 

Lưu ý: với số nguyên thì các khoảng liền nhau, nên không có điểm nào rơi vào khoảng trống giữa hai mức.

Kiểm tra hạn dùng

Chứng chỉ điểm thường không ghi ngày hết hạn, nhưng nhiều đơn vị tiếp nhận chỉ nhận kết quả trong khoảng 2 năm kể từ ngày thi. Số năm này do nơi nhận hồ sơ quy định, nên mình để thành tham số:

def con_han(ngay_thi: date, hom_nay: date, so_nam: int = 2) -> bool: try: han = ngay_thi.replace(year=ngay_thi.year + so_nam) except ValueError: # ngày 29/2 của năm nhuận han = date(ngay_thi.year + so_nam, 2, 28) return hom_nay <= han print(con_han(date(2025, 3, 1), date(2026, 11, 15))) # True print(con_han(date(2024, 3, 1), date(2026, 11, 15))) # False 

Đoạn try/except xử lý trường hợp thi vào 29/2: cộng năm trực tiếp sẽ báo lỗi nếu năm đích không nhuận.

Có thể mở rộng

  • Đọc bảng từ file CSV để thay đổi khi quy định đổi, không phải sửa mã.
  • Thêm quy đổi cho thang điểm khác và so sánh với yêu cầu bậc của từng hồ sơ.
  • Viết vài test bằng pytest cho các mốc biên ở trên.

Nếu bạn có cách làm gọn hơn, mình rất muốn đọc bình luận.