Python bài 11: Hàm, tham số, return và phạm vi biến
- 18-10-2026
- Toanngo92
- 0 Comments
Giáo trình Python miễn phí · Chương 6/12: Hàm, module và tổ chức chương trình · Bài 11/24.
Mục lục
Mục tiêu bài học
Tách chương trình thành chức năng nhỏ, truyền dữ liệu rõ ràng và tránh trạng thái dùng chung ngoài ý muốn.
Hàm nhận đầu vào và tạo kết quả
Một hàm nên thực hiện một công việc có tên rõ nghĩa. def khai báo hàm; tham số là tên trong định nghĩa, đối số là giá trị truyền khi gọi. return trả kết quả và kết thúc lần gọi hiện tại. Hàm không return rõ ràng sẽ trả None.
print() hiển thị ra màn hình còn return đưa dữ liệu cho phần còn lại của chương trình. Hàm tính tổng nên trả số để có thể kiểm thử, lưu tệp hoặc hiển thị theo nhiều cách, thay vì luôn tự in kết quả.
def tinh_hoc_phi(so_buoi, don_gia=150000):
"""Tính học phí, không chấp nhận số âm."""
if so_buoi < 0 or don_gia < 0:
raise ValueError("Số buổi và đơn giá phải không âm")
return so_buoi * don_gia
print(tinh_hoc_phi(4))
print(tinh_hoc_phi(don_gia=100000, so_buoi=3))
def tong_diem(*diem):
return sum(diem)
print(tong_diem(7, 8, 9))
Kết quả:
600000 300000 24
Tham số mặc định, keyword và tham số linh hoạt
Đối số vị trí gắn theo thứ tự; đối số keyword gắn theo tên. *args gom các đối số vị trí bổ sung thành tuple; **kwargs gom các keyword bổ sung thành dict. Không cần dùng chúng trong mọi hàm: một chữ ký cụ thể thường dễ đọc và dễ kiểm tra hơn.
Giá trị mặc định được đánh giá khi định nghĩa hàm, không tạo mới ở mỗi lần gọi. Vì vậy không dùng list hoặc dict mutable làm mặc định nếu mong mỗi lần gọi độc lập. Dùng None rồi tạo bên trong.
def them_hoc_vien(ten, danh_sach=None):
if danh_sach is None:
danh_sach = []
danh_sach.append(ten)
return danh_sach
print(them_hoc_vien("An"))
print(them_hoc_vien("Bình"))
def thong_tin(**thuoc_tinh):
return sorted(thuoc_tinh)
print(thong_tin(ten="An", lop="PY01"))
Kết quả:
['An'] ['Bình'] ['lop', 'ten']
Biến cục bộ và tham chiếu
Tên tạo trong hàm thường là local. Python tìm tên qua các phạm vi local, enclosing, global rồi builtins. Hạn chế sửa biến global; truyền dữ liệu qua tham số và trả về kết quả thường dễ theo dõi hơn. Đối số truyền vào không tự sao chép sâu: nếu hàm sửa list nhận được, bên gọi có thể thấy thay đổi đó.
lambda tạo hàm ngắn chỉ có một biểu thức, thích hợp làm key cho sorted(). Đệ quy là hàm gọi lại chính nó; cần trường hợp dừng và dữ liệu tiến về trường hợp đó. Với người mới, ưu tiên vòng lặp nếu cùng bài toán có cách viết đơn giản hơn.
Lỗi thường gặp và lưu ý
- Đừng đặt return bên trong vòng lặp nếu cần xử lý mọi phần tử; nó sẽ kết thúc hàm ngay lần đầu đi qua.
- Type hint không tự kiểm tra dữ liệu lúc chạy; phần kiểm tra đầu vào vẫn phải viết theo yêu cầu.
Ghi nhớ
Hàm tốt có trách nhiệm rõ, đầu vào và kết quả dễ hiểu. Đặc biệt cần hiểu return, phạm vi tên và mặc định mutable để tránh lỗi khó truy tìm.

