
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ằnginput()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.

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 |
| dễ | đổi độ C sang độ F | phép tính, |
2 |
| dễ | xếp loại Giỏi, Khá, Trung bình, Yếu |
|
3 |
| dễ | kiểm tra năm nhuận |
|
4 |
| dễ | tổng các chữ số, kể cả số âm |
|
5 |
| dễ | chia hóa đơn, làm tròn lên nghìn | chia lấy nguyên |
6 |
| vừa | kiểm tra số nguyên tố |
|
7 |
| vừa | chuẩn hóa họ tên có dấu |
|
8 |
| vừa | số lớn thứ hai, bỏ số trùng |
|
9 |
| vừa | bỏ điểm cao nhất, thấp nhất rồi tính trung bình | list, |
10 |
| vừa | đưa số di động về dạng +84 |
|
11 |
| vừa | tìm từ xuất hiện nhiều nhất | dict đếm |
12 |
| 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:
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.
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:

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:

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ả:

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 |
|
| thay |
3 |
|
| thêm điều kiện chia hết cho 100 và 400 |
4 |
|
| duyệt từng ký tự, đổi sang |
6 |
|
| chặn |
8 |
|
| bỏ số trùng bằng |
9 |
| list của người gọi mất hai phần tử | chép ra list mới bằng |
Ở 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ự:
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.

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:

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

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 sauinput(). 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ằnginput(), 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
Học Python từ số 0: lộ trình 8 chặng, mỗi chặng có một đoạn code đã chạy thử.
Python là gì, dùng để làm gì: 5 đoạn code ngắn cho 5 việc hay làm bằng Python.
Khóa học Python nào tốt: 9 câu nên hỏi trước khi trả tiền cho một khóa học.
Data Analyst, Data Scientist và AI Engineer khác nhau ở đâu: nếu bạn học Python để làm về dữ liệu.
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 PythonTham vấn chuyên môn
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.


