Bỏ qua đến nội dung chính
Học Python
Logo Python cạnh cửa sổ code trên nền navy quầng sáng xanh

Bài tập Python có lời giải cho người mới (kèm tự chấm)

AIDev TeamTham vấn chuyên môn: Nguyễn Việt Chung

Đăng 13 phút đọc6 lượt xem

Mục lục · 17

Bài tập Python cho người mới nên có đề rõ, lời giải mẫu và một cách tự kiểm tra đúng sai. Bài này có 12 bài từ dễ đến vừa, lời giải đầy đủ và file cham.py chấm 55 test chỉ bằng một lệnh. Kèm kết quả chấm thật khi làm sai và các lỗi người mới hay gặp.

Bài tập Python cho người mới nên có ba thứ: đề rõ ràng, lời giải mẫu và một cách để tự biết mình làm đúng hay sai mà không phải ngồi so kết quả bằng mắt. Bộ 12 bài dưới đây có đủ ba thứ đó. Bạn viết code vào file bai_lam.py, gõ python cham.py, và chưa tới một giây sau máy đã chấm xong 55 test, báo bài nào đạt, bài nào sai ở test nào.

Ngày 23/10/2026, mình chạy toàn bộ lời giải và bộ chấm trên Python 3.15.1, bản ổn định mới nhất lúc đó. Mấy điều nên biết trước:

  • 12 bài đi từ dễ (đổi độ C sang độ F, năm nhuận) đến vừa (chuẩn hóa số điện thoại, đếm từ, gom nhóm bằng dict).

  • Bộ chấm chỉ dùng standard library (thư viện có sẵn khi cài Python), nên không cần cài thêm gì. Mình đã chạy được trên Python 3.15.1, 3.14.7 và 3.9.6.

  • Mỗi bài là một hàm có return, nên bạn không phải gõ dữ liệu bằng input() mỗi lần thử.

  • Bài 5 và bài 9 trích từ ebook Bài tập Python từ số 0 của AIDev. Mười bài còn lại mình viết riêng cho bài này.

Tìm trên Google thì gặp những tài liệu nào?

Ngày 23/10/2026, mình lấy 20 kết quả đầu của Google tại Việt Nam cho hai từ khóa "bài tập python" và "bài tập python có lời giải". Bỏ các URL trùng thì còn 37 trang. Mình mở từng trang để xếp loại. Các trang Scribd, ba trang Studocu và hai trang Reddit không hiện nội dung hoặc không mở được, nên mình xếp chúng theo tên miền.

Biểu đồ phân loại 37 trang trong top 20 Google khi tìm bài tập Python ngày 23/10/2026: 13 bài tổng hợp đề và code mẫu, 12 file PDF tải lên lại, 8 trang video, Facebook hoặc Reddit, 2 trang học luyện code trên web, 2 sàn bán sách

Gần một phần ba số kết quả là file trên Studocu, Scribd hoặc PDF của trung tâm. Nhóm đông nhất là 13 bài tổng hợp đề kèm code mẫu. Mình đọc hết 13 bài này và không bài nào có bộ test để người học tự chấm. Muốn biết code của mình có đúng không, bạn phải tự chạy rồi so từng dòng với kết quả trong bài.

Bài đứng đầu cho từ khóa "có lời giải" ghi rõ code mẫu viết trên Python 3.6.2, và hai trang khác trong top 20 đăng lại đúng bài đó. Theo PEP 494, Python 3.6 đã hết hỗ trợ từ ngày 23/12/2021. Mình không chạy lại code của bài đó nên không dám nói bao nhiêu đoạn còn chạy được trên bản mới. Dù sao, bạn nên biết mình đang học theo tài liệu viết cho bản Python nào.

Bộ 12 bài tập Python này gồm những gì?

Bảng dưới tóm tắt 12 bài. Đề đầy đủ, kèm ví dụ, nằm trong docstring (đoạn chú thích đặt trong ba dấu nháy ngay dưới dòng def) của mỗi hàm trong file bai_lam.py. Bạn tải bộ bài tập về là có file này.

Bài

Hàm cần viết

Mức

Làm gì

Kiến thức chính

1

do_c_sang_f

dễ

đổi độ C sang độ F

phép tính, return

2

xep_loai

dễ

xếp loại Giỏi, Khá, Trung bình, Yếu

if, elif

3

la_nam_nhuan

dễ

kiểm tra năm nhuận

%, and, or

4

tong_chu_so

dễ

tổng các chữ số, kể cả số âm

str, vòng for

5

chia_tien

dễ

chia hóa đơn, làm tròn lên nghìn

chia lấy nguyên //

6

la_so_nguyen_to

vừa

kiểm tra số nguyên tố

while, dừng sớm

7

chuan_hoa_ten

vừa

chuẩn hóa họ tên có dấu

split, join

8

so_lon_thu_hai

vừa

số lớn thứ hai, bỏ số trùng

set, sorted

9

diem_giam_khao

vừa

bỏ điểm cao nhất, thấp nhất rồi tính trung bình

list, remove

10

chuan_hoa_sdt

vừa

đưa số di động về dạng +84

replace, isdigit

11

tu_nhieu_nhat

vừa

tìm từ xuất hiện nhiều nhất

dict đếm

12

nhom_theo_tinh

vừa

gom học viên theo tỉnh

dict chứa list

Bạn nên học xong biến, if, vòng lặp, list, dict và hàm rồi hãy làm. Nếu còn thiếu phần nào, bài học Python từ số 0 có thứ tự các chủ đề và cách cài Python.

Mỗi hàm trong file bài làm có đề ở docstring và một dòng pass để bạn thay bằng code. Ví dụ bài 5:

python
def chia_tien(hoa_don, so_nguoi, tip):
    """Bài 5 (dễ). Nhóm bạn đi ăn, cộng tiền tip rồi chia đều. Tiền tip bằng
    hoa_don × tip / 100, bỏ phần lẻ dưới 1 đồng. Tổng (hóa đơn + tip) chia
    cho số người, còn dư thì làm tròn LÊN đồng kế tiếp, rồi làm tròn LÊN
    hàng nghìn (số đã tròn nghìn thì giữ nguyên). Trả về số tiền mỗi người trả.
    Ví dụ: chia_tien(1250000, 3, 10) trả về 459000
    """
    pass

Chạy bộ tự chấm thế nào?

Bộ bài gồm bốn file: bai_lam.py (đề và chỗ viết code), cham.py (bộ chấm), loi_giai.py (lời giải mẫu) và README.txt. Tải bộ bài tập về và giải nén, bạn sẽ có thư mục bai-tap-python. Sau đó mở terminal (cửa sổ gõ lệnh) trong thư mục này và chạy các lệnh bên dưới. Nếu dùng VS Code, bạn mở thư mục bằng File > Open Folder rồi chọn Terminal > New Terminal. Terminal mới mở sẽ ở sẵn trong thư mục bài tập.

bash
python cham.py              # chấm cả 12 bài
python cham.py 5            # chấm riêng bài 5
python cham.py --loi-giai   # chấm lời giải mẫu

Trên Windows, nếu gõ python mà không chạy thì dùng lệnh py (xem hướng dẫn dùng Python trên Windows của python.org). Trên macOS và Linux thì gõ python3. Bản mình dùng là 3.15.1, cũng là bản hiện trên nút tải của python.org ngày 23/10/2026:

Trang tải python.org ngày 23/10/2026 với nút Download Python 3.15.1

Khi chưa làm bài nào, máy chấm báo hàm đang trả về None và nhắc bạn còn sót dòng pass:

Terminal Python 3.15.1: thư mục bài tập có bai_lam.py, cham.py, loi_giai.py, README.txt; chấm bài 1 khi chưa làm thì báo chưa đạt 0/4 test, hàm trả về None

Với mỗi bài sai, máy chấm chỉ in test sai đầu tiên: lời gọi hàm, kết quả mong đợi và kết quả của bạn. Mình chủ ý để vậy, vì người mới sửa từng lỗi một thì dễ hơn đọc cả chục dòng đỏ một lúc. Nếu code bị lặp vô hạn, máy chấm dừng test đó sau 3 giây và chấm tiếp test sau. Nó cũng báo lỗi khi hàm của bạn sửa list được truyền vào.

Người mới hay mắc lỗi gì khi làm bài Python?

Mình viết thử một bản làm bài có sáu lỗi mà người mới hay mắc, rồi cho máy chấm. Đây là kết quả:

Terminal Python 3.15.1: chấm bản làm thử, 6/12 bài đạt; bài 1 có in ra 32.0 nhưng không return, bài 3 sai năm 1900, bài 4 TypeError, bài 6 coi 0 là số nguyên tố, bài 8 trả về 7 với list 7 7 5, bài 9 sửa list truyền vào

Bảng dưới tóm tắt sáu lỗi, test làm lộ lỗi và cách sửa:

Bài

Code sai

Test làm lộ lỗi

Cách sửa

1

print(c * 9 / 5 + 32)

do_c_sang_f(0) trả về None

thay print bằng return

3

return nam % 4 == 0

la_nam_nhuan(1900) trả về True

thêm điều kiện chia hết cho 100 và 400

4

return sum(str(n))

TypeError ngay test đầu

duyệt từng ký tự, đổi sang int rồi cộng

6

for i in range(2, n) rồi return True

la_so_nguyen_to(0) trả về True

chặn n < 2 trước vòng lặp

8

sorted(ds)[-2]

so_lon_thu_hai([7, 7, 5]) trả về 7

bỏ số trùng bằng set rồi mới sắp xếp

9

diem.remove(...) trên list nhận vào

list của người gọi mất hai phần tử

chép ra list mới bằng list(diem)

Ở bài 1, hàm in ra 32.0 trông như đúng, nhưng giá trị trả về là None. Máy chấm thấy chữ được in ra nên nhắc luôn cách sửa. Bài 3 sai vì năm 1900 chia hết cho 4 nhưng không phải năm nhuận, do chia hết cho 100 mà không chia hết cho 400.

Bài 4 thì Python dừng hẳn, vì sum cộng số còn str(n) là chuỗi ký tự:

text
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Bài 9 là lỗi khó thấy nhất. Điểm trung bình vẫn đúng, chỉ có list của người gọi hàm bị mất hai phần tử. Nếu tự chạy thử bằng tay, bạn phải in lại list sau khi gọi hàm thì mới phát hiện ra.

Code chạy mãi không dừng

Ở bài 6, nếu viết vòng while mà quên dòng i += 1, biến i không bao giờ tăng nên vòng lặp không kết thúc. Mình thử đúng lỗi này: máy chấm dừng mỗi test sau 3 giây, cả bài 6 mất 9,1 giây và báo chưa đạt 3/6.

Terminal Python 3.15.1: chấm bài 6 có vòng while quên tăng biến đếm, test la_so_nguyen_to(9) báo chạy quá 3 giây, có thể bị lặp vô hạn, thời gian chạy 9,10 giây

Ba test đạt là 0, 1 và 2: với 0 và 1 hàm trả kết quả trước khi vào vòng lặp, còn với 2 thì vòng while không chạy lần nào. Ba test 9, 97 và 7919 thì treo. Nếu tự chạy file mà không có máy chấm, bạn bấm Ctrl+C để dừng. Nếu biết trước số lần lặp, bạn có thể dùng vòng for với range() để khỏi tự tăng biến đếm. Bài vòng lặp for trong Python có ví dụ chạy thật và phép đo for so với while.

Lỗi thụt lề

Python dùng thụt lề để biết dòng nào nằm trong vòng for. Mình xóa bốn dấu cách trước dòng tong += int(chu_so) trong bài 4. Máy chấm không nạp được file nên báo dòng lỗi trước khi chấm, giống thông báo của Python khi chạy trực tiếp:

Terminal Python 3.15.1: chấm bài 4 báo IndentationError expected an indented block after 'for' statement on line 34, chạy python bai_lam.py báo cùng lỗi ở dòng 35
text
IndentationError: expected an indented block after 'for' statement on line 34

Lỗi cú pháp ở bất kỳ bài nào cũng làm cả file không nạp được, nên khi thấy IndentationError hay SyntaxError thì sửa lỗi đó trước rồi mới chấm lại.

Lời giải 12 bài

Bạn chỉ nên mở phần này sau khi đã có một bản chạy được, hoặc đã bí một bài quá 20 phút. Lời giải dưới đây nằm trong file loi_giai.py và đạt đủ 55/55 test.

python
def do_c_sang_f(c):
    return c * 9 / 5 + 32


def xep_loai(diem):
    if diem < 0 or diem > 10:
        return "Điểm không hợp lệ"
    if diem >= 8:
        return "Giỏi"
    if diem >= 6.5:
        return "Khá"
    if diem >= 5:
        return "Trung bình"
    return "Yếu"


def la_nam_nhuan(nam):
    return nam % 4 == 0 and (nam % 100 != 0 or nam % 400 == 0)


def tong_chu_so(n):
    tong = 0
    for chu_so in str(abs(n)):
        tong += int(chu_so)
    return tong


def chia_tien(hoa_don, so_nguoi, tip):
    tong = hoa_don + hoa_don * tip // 100
    moi_nguoi = (tong + so_nguoi - 1) // so_nguoi   # tròn LÊN đồng
    return (moi_nguoi + 999) // 1000 * 1000         # tròn LÊN nghìn


def la_so_nguyen_to(n):
    if n < 2:
        return False
    i = 2
    while i * i <= n:
        if n % i == 0:
            return False
        i += 1
    return True

Bài 5 có một mẹo nhỏ: // làm tròn xuống, nên muốn làm tròn lên thì cộng thêm (số chia trừ 1) vào số bị chia rồi mới chia. Ở bài 6, vòng lặp chỉ cần chạy tới căn bậc hai của n, vì nếu n có ước lớn hơn căn bậc hai thì nó cũng có một ước nhỏ hơn.

python
def chuan_hoa_ten(ho_ten):
    return " ".join(tu.capitalize() for tu in ho_ten.split())


def so_lon_thu_hai(ds):
    khac_nhau = sorted(set(ds))
    if len(khac_nhau) < 2:
        return None
    return khac_nhau[-2]


def diem_giam_khao(diem):
    con_lai = list(diem)          # chép ra list mới, không sửa list người gọi
    con_lai.remove(max(con_lai))  # remove chỉ xóa lần xuất hiện đầu tiên
    con_lai.remove(min(con_lai))
    return round(sum(con_lai) / len(con_lai), 2)


def chuan_hoa_sdt(sdt):
    so = sdt.strip().replace(".", "").replace("-", "").replace(" ", "")
    if len(so) != 10 or not so.isdigit() or so[0] != "0":
        return None
    return "+84" + so[1:]


def tu_nhieu_nhat(van_ban):
    dem = {}
    for tu in van_ban.lower().split():
        tu = tu.strip(".,!?;:\"'()")
        if tu:
            dem[tu] = dem.get(tu, 0) + 1
    if not dem:
        return None
    tu = max(dem, key=dem.get)   # bằng nhau thì lấy từ gặp trước
    return (tu, dem[tu])


def nhom_theo_tinh(danh_sach):
    nhom = {}
    for dong in danh_sach:
        ten, tinh = dong.split(",")
        tinh = " ".join(tinh.split()).title()
        nhom.setdefault(tinh, []).append(ten.strip())
    return nhom

split() không đối số vừa tách theo dấu cách vừa bỏ luôn dấu cách thừa, nên bài 7 và bài 12 chỉ cần một dòng để chuẩn hóa. Ở bài 11, dict trong Python giữ thứ tự thêm khóa, còn max trả về khóa đầu tiên khi có nhiều giá trị bằng nhau. Vì vậy từ xuất hiện trước sẽ thắng mà không cần viết thêm điều kiện.

Chấm lời giải mẫu trên Python 3.15.1 cho kết quả 12/12 bài. Mình chạy lại trên Python 3.14.7 và 3.9.6, kết quả giống hệt:

Terminal Python 3.15.1: chạy python cham.py --loi-giai, cả 12 bài đạt, tổng 55 test, kết quả 12/12 bài đạt

Khi nào bộ bài tập này chưa đủ?

  • Khi bạn cần luyện đọc dữ liệu từ bàn phím. Cả 12 bài đều dùng hàm và return, nên bạn không có dịp luyện chuyện đổi kiểu sau input(). Bài chương trình Python mẫu có các chương trình nhỏ đọc dữ liệu từ bàn phím bằng input(), như tính BMI hay đoán số, để bạn tập phần này.

  • Khi bạn đã qua mức "vừa". Bộ này chưa có bài về file, xử lý ngoại lệ hay class.

  • Khi test đạt hết nhưng bạn vẫn chưa hiểu vì sao code chạy. Máy chấm chỉ biết kết quả đúng hay sai, không đánh giá code có dễ đọc không. Lúc đó bạn cần một người xem code giúp.

  • Khi đề thi của bạn chấm theo kết quả in ra màn hình, phải đúng một định dạng cố định. Bộ này chỉ chấm giá trị return, không chấm phần in ra.

Ebook Bài tập Python từ số 0 có thêm phần đọc dữ liệu nhập. 100 bài trong sách chia 10 chương, từ biến và chuỗi đến file, class và một chương sửa code mà trợ lý AI viết sai. Chương 1 đến 5 chấm theo dữ liệu nhập và kết quả in ra, còn chương 6 đến 10 chấm bằng test hàm như bộ này.

Câu hỏi thường gặp

Người mới nên làm bao nhiêu bài tập Python mỗi ngày?

Không có con số chung. Với người mới, mình thấy hai đến ba bài một ngày mà tự làm tới khi đạt hết test thì có ích hơn mười bài chép lời giải. Học xong chủ đề nào thì làm bài của chủ đề đó luôn.

Có nên xem lời giải ngay khi bí không?

Không nên. Bạn đọc lại đề, chạy python cham.py <số bài> xem test nào sai, in thử giá trị trung gian bằng print. Nếu sau 20 phút vẫn bí thì mới mở lời giải, đọc hiểu xong thì đóng lại và tự gõ lại từ đầu.

Bài tập Python có lời giải PDF tải ở đâu?

File trên Studocu và Scribd là tài liệu người dùng tự tải lên lại. Khi mở bằng trình duyệt, mình không xem được nội dung các file Scribd, nên khó biết trước file viết cho bản Python nào. Nếu cần bài tập kèm đáp án, bạn nên lấy giáo trình miễn phí ngay trên trang của tác giả, ví dụ Think Python hay Automate the Boring Stuff. Bài giáo trình Python cho người mới có danh sách các giáo trình này và chỗ lấy lời giải.

Cần cài gì để chạy bộ tự chấm?

Chỉ cần Python 3.9 trở lên. Gõ python --version (Windows có thể là py --version) để xem máy đang có bản nào. Bộ chấm không dùng package ngoài, nên không phải chạy pip install gì cả. Nếu chưa chọn được phần mềm để viết code, bài phần mềm lập trình Python so VS Code, PyCharm và Thonny cho người mới.

Viết khác lời giải mẫu thì có sao không?

Không sao. Máy chấm chỉ so kết quả trả về, không so cách viết. Bài 4 chẳng hạn có thể giải bằng vòng while với % 10 và // 10, cũng đạt đủ 4 test.

Đọc tiếp

Làm xong 12 bài mà vẫn muốn luyện tiếp, bạn xem ebook Bài tập Python từ số 0 của AIDev: 100 bài có gợi ý ba tầng khi bí, lời giải đã chạy thật và bộ chấm cham.py cho từng bài. Bạn được đọc thử 115 trang đầu trước khi mua.

Lời giải và bộ chấm chạy ngày 23/10/2026 trên Mac M4 Pro, macOS 27.0.1, Python 3.15.1, 3.14.7 và 3.9.6. Kết quả Google lấy cùng ngày tại Việt Nam, 20 kết quả đầu cho mỗi từ khóa.

Chuyên mục

Học Python

Tham vấn chuyên môn

Nguyễn Việt Chung

Nhà sáng lập AIDev và VietPlatform · Thạc sĩ AI MSE

  • Tốt nghiệp thủ khoa xuất sắc Thạc sĩ AI MSE.
  • Đồng sáng lập, CTO E-University, SVOnline: số hóa 10+ đại học, 40.000+ sinh viên.
  • Xây hệ thống AI cho doanh nghiệp tại VietPlatform.
Biên soạn: AIDev Team · Rà soát · Quy trình biên tập