Bài 8: Hàm (function) trong Python

Bài 7 bạn đã gom dữ liệu bằng dictionary. Giờ ta học cách gom hành động: hàm (function) — một khối lệnh có tên, viết một lần rồi gọi lại nhiều lần. Hàm là bước ngoặt giúp code từ “chạy được” thành “gọn gàng, dễ đọc, dễ sửa”. Cuối bài bạn viết lại chương trình quản lý điểm bằng các hàm sạch sẽ.
⏱️ Cách học bài này (~30 phút): đọc def/tham số/return (10’), tự gõ và chạy các bài thực hành (12’), xem lỗi thường gặp (4’), tự kiểm + lưu code mang về (4’).
Mục tiêu bài học
Sau bài này bạn sẽ:
- Định nghĩa hàm bằng
defvà gọi hàm. - Truyền tham số và lấy kết quả bằng
return. - Phân biệt return và print.
- Dùng tham số mặc định — và tái tổ chức chương trình bằng hàm.
Nội dung: hàm trong Python
1. Định nghĩa & gọi hàm
Dùng def, đặt tên, thân hàm thụt lề:
def chao(ten):
print(f"Xin chào, {ten}!")
chao("Lan") # gọi hàm → Xin chào, Lan!
chao("Nam") # gọi lại, không cần viết lại code
ten là tham số — dữ liệu bạn truyền vào mỗi lần gọi.
2. return — trả kết quả về
print chỉ hiển thị; return trả giá trị để dùng tiếp:
def tinh_tong(a, b):
return a + b
kq = tinh_tong(2, 3) # lấy kết quả vào biến
print(kq) # 5
print(tinh_tong(10, 5) * 2) # dùng trực tiếp → 30
⚠️ return ≠ print. Hàm chỉ
return.
3. Tham số mặc định
Gán sẵn giá trị cho tham số khi không truyền:
def chao(ten, loi="Xin chào"):
print(f"{loi}, {ten}!")
chao("Lan") # Xin chào, Lan!
chao("Nam", "Chào buổi sáng") # Chào buổi sáng, Nam!
Code mẫu có chú thích: quản lý điểm bằng hàm
Tái tổ chức chương trình điểm (Bài 4–5) thành các hàm gọn:
def xep_loai(diem):
if diem >= 8:
return "Giỏi"
elif diem >= 6.5:
return "Khá"
elif diem >= 5:
return "Trung bình"
return "Yếu"
def trung_binh(ds):
return sum(ds) / len(ds) # sum() cộng cả danh sách
diem_list = [8, 6.5, 9, 4]
tb = trung_binh(diem_list)
print(f"Trung bình: {tb:.2f}") # Trung bình: 6.88
print(f"Xếp loại: {xep_loai(tb)}") # Xếp loại: Khá
Mấu chốt: mỗi hàm làm một việc rõ ràng (xep_loai, trung_binh), có return để dùng kết quả, và tái dùng được ở bất cứ đâu.
Bài thực hành code (tự gõ)
Bài 1 — Hàm chào: viết def chao(ten) in “Xin chào, <tên>!”, rồi gọi với 2 tên khác nhau.
Bài 2 — Hàm tính diện tích: viết def dien_tich(dai, rong) trả về dài × rộng; in diện tích hình 5×3.
✅ Gợi ý: dùng return, rồi print(dien_tich(5, 3)).
Bài 3 — Tham số mặc định: viết def tinh_thue(gia, thue=0.1) trả về tiền thuế; gọi một lần dùng mặc định, một lần truyền thue=0.08.
Lỗi thường gặp & cách sửa
- Quên
return→ hàm trả vềNone;kq = ham()ra None. Cần kết quả thì phảireturn. - Nhầm return với print → in ra thì thấy, nhưng
kq = ham()không dùng được. Xem lại mục 2. - Sai số/thứ tự tham số →
dien_tich(5, 3)khácdien_tich(3, 5)nếu bạn hiểu nhầm vai trò; đặt tên tham số rõ ràng. IndentationError→ thân hàm phải thụt lề 4 dấu cách (xem Bài 4).- Tham số mặc định phải đứng sau tham số thường:
def f(a, b=1)đúng,def f(a=1, b)lỗi.
💾 Mang về — bộ hàm quản lý điểm
Lưu vào kho code cá nhân (bài L8 trong series). (Ở đây gộp if điều_kiện: return ... trên một dòng cho gọn — Python cho phép, tương đương cách viết xuống dòng ở trên.)
# ham_diem.py — quản lý điểm bằng hàm
def xep_loai(diem):
if diem >= 8: return "Giỏi"
elif diem >= 6.5: return "Khá"
elif diem >= 5: return "Trung bình"
return "Yếu"
def trung_binh(ds):
return sum(ds) / len(ds) if ds else 0 # tránh chia 0
diem = [8, 6.5, 9, 4]
tb = trung_binh(diem)
print(f"TB: {tb:.2f} | Xếp loại: {xep_loai(tb)}")
Thuật ngữ chốt
| Thuật ngữ | Giải thích ngắn |
|---|---|
| def | Từ khoá định nghĩa hàm |
| tham số (parameter) | Biến nhận dữ liệu truyền vào hàm |
| đối số (argument) | Giá trị thực truyền vào khi gọi hàm |
| return | Trả giá trị ra khỏi hàm để dùng tiếp |
| tham số mặc định | Giá trị gán sẵn khi không truyền |
| gọi hàm (call) | Chạy hàm bằng tên_hàm(...) |
Tự kiểm tra & lời giải
defdùng để làm gì? (Đáp án: định nghĩa một hàm)- Hàm không có
returntrả về gì? (Đáp án:None) returnkhácprintở đâu? (Đáp án: return trả giá trị để dùng tiếp; print chỉ hiển thị)
Lời giải Bài thực hành:
# Bài 1
def chao(ten):
print(f"Xin chào, {ten}!")
chao("Lan"); chao("Nam")
# Bài 2
def dien_tich(dai, rong):
return dai * rong
print(dien_tich(5, 3)) # 15
# Bài 3
def tinh_thue(gia, thue=0.1):
return gia * thue
print(tinh_thue(100000)) # 10000.0 (mặc định 0.1)
print(tinh_thue(100000, 0.08)) # 8000.0
Ghi nhớ nhanh
- Định nghĩa:
def ten_ham(tham_so):+ thân thụt lề; gọi:ten_ham(...). returnđể lấy kết quả dùng tiếp;printchỉ hiển thị.- Mỗi hàm làm một việc rõ; tham số mặc định đứng sau tham số thường.
👉 Bài tập về nhà: gộp chương trình đếm từ (Bài 3) thành một hàm dem_tu(cau) trả về số từ, rồi gọi thử. Bài tiếp theo trong series: Bài 9 — Xử lý lỗi try/except (sắp đăng).
Câu hỏi thường gặp
Hàm (function) trong Python là gì và để làm gì?
Hàm là một khối lệnh được đặt tên để tái sử dụng: viết một lần, gọi nhiều lần. Bạn định nghĩa bằng từ khoá def, truyền dữ liệu vào qua tham số, và lấy kết quả ra bằng return. Hàm giúp code gọn, dễ đọc, dễ sửa — thay vì copy cùng một đoạn lệnh ở nhiều nơi, bạn gói nó vào một hàm và gọi khi cần.
return và print khác nhau thế nào?
print chỉ HIỂN THỊ ra màn hình cho người xem, còn return TRẢ giá trị về để chương trình dùng tiếp (gán vào biến, tính toán). Ví dụ hàm có return cho phép bạn viết ‘kq = tinh_tong(2,3)’ rồi dùng kq. Nếu chỉ print, bạn không lấy lại được kết quả để xử lý. Người mới hay nhầm hai cái này.
Tham số mặc định (default) trong hàm là gì?
Là giá trị gán sẵn cho tham số khi người gọi không truyền vào. Ví dụ def chao(ten, loi=‘Xin chào’) — nếu gọi chao(‘Lan’) thì loi tự là ‘Xin chào’. Tham số mặc định giúp hàm linh hoạt: dùng nhanh với giá trị thường gặp, mà vẫn cho phép đổi khi cần.
Thợ code chính hiệu, thích dắt người mới qua mấy đoạn 'khó nhằn' bằng giọng nhẹ tênh. Châm ngôn: cứ làm dự án thật, sai thì sửa, vui là chính.
Bài liên quan

AI có thay thế lập trình viên không? Góc nhìn thực tế
AI viết code ngày càng giỏi khiến nhiều người lo: liệu lập trình viên có bị thay thế? Bài này đưa góc nhìn thực tế — AI làm được gì, chưa làm được gì, nghề lập trình đang thay đổi ra sao, và người mới nên học gì để không bị bỏ lại.

Frontend, backend hay fullstack: nên theo hướng nào?
Mới học lập trình web và phân vân giữa frontend, backend hay fullstack? Bài này giải thích rõ mỗi hướng làm gì, cần kỹ năng nào, hợp với ai, cơ hội việc làm ra sao — và lời khuyên thực tế cho người mới chọn đường.

10 dự án nhỏ để luyện lập trình cho người mới
Học cú pháp mãi mà không tiến bộ? Cách nhanh nhất để giỏi lập trình là làm dự án nhỏ. Bài này gợi ý 10 dự án tăng dần độ khó — từ máy tính bỏ túi tới ứng dụng ghi chú — kèm kỹ năng mỗi dự án rèn và cách bắt tay làm.