Hàm trong lập trình: cách chia nhỏ chương trình cho dễ hiểu

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Khi chương trình dài ra, việc nhét mọi thứ vào một chỗ nhanh chóng trở thành cơn ác mộng. Hàm là cách để bạn gói một nhóm lệnh lại, đặt cho nó một cái tên và gọi lại bất cứ khi nào cần.

Hàm là gì?

Hàm (function) là một khối code có tên, nhận vào dữ liệu (tham số), xử lý, rồi có thể trả về kết quả. Hãy nghĩ nó như máy xay sinh tố: bạn bỏ trái cây vào, bấm nút, nhận ly nước ép. Bạn không cần biết dao quay bên trong thế nào mỗi lần dùng.

def chao(ten):
    return "Xin chào, " + ten + "!"

print(chao("Lan"))   # Xin chào, Lan!
print(chao("Nam"))

Ở đây chao là tên hàm, ten là tham số, return trả kết quả về nơi gọi. Cùng một hàm, ta dùng nhiều lần với dữ liệu khác nhau.

Vì sao nên dùng hàm?

  • Tái sử dụng: viết một lần, dùng nhiều nơi.
  • Dễ đọc: tên hàm mô tả việc đang làm, ví dụ tinh_tien_thue().
  • Dễ sửa: lỗi nằm ở một chỗ thì sửa một chỗ.
  • Dễ kiểm thử: kiểm tra từng hàm nhỏ độc lập.

Nguyên tắc nổi tiếng trong ngành là DRY: Don't Repeat Yourself, đừng lặp lại chính mình. Nếu bạn copy-paste một đoạn code đến lần thứ ba, đó là dấu hiệu nên tách nó thành hàm.

Tham số và giá trị trả về

Một hàm có thể có nhiều tham số, có giá trị mặc định, và trả về nhiều thứ:

def tinh_dien_tich(dai, rong=1):
    return dai * rong

print(tinh_dien_tich(5, 3))   # 15
print(tinh_dien_tich(5))      # 5

def min_max(ds):
    return min(ds), max(ds)

nho, lon = min_max([4, 1, 9])
print(nho, lon)   # 1 9

Phân biệt hai thuật ngữ: tham số (parameter) là tên khai báo trong định nghĩa hàm, còn đối số (argument) là giá trị thực tế bạn truyền vào khi gọi.

Hàm không trả về gì

Không phải hàm nào cũng cần return. Hàm chỉ in ra màn hình hoặc ghi file thì thực hiện một "hành động". Tuy nhiên, hàm trả về giá trị thường linh hoạt hơn vì nơi gọi quyết định dùng kết quả thế nào. Một lỗi hay gặp là quên return rồi thắc mắc vì sao kết quả là None.

Phạm vi biến trong hàm

Biến tạo bên trong hàm chỉ tồn tại trong hàm đó:

def dem():
    so = 10
    return so

dem()
print(so)   # Lỗi: biến so không tồn tại ở ngoài

Điều này là chủ ý, nó giúp các hàm không "giẫm chân" nhau. Muốn đưa dữ liệu vào thì dùng tham số, muốn lấy ra thì dùng return.

Viết hàm tốt

  1. Mỗi hàm làm một việc. Nếu bạn phải dùng chữ "và" để mô tả hàm, hãy cân nhắc tách ra.
  2. Đặt tên là động từ: tinh_tong, kiem_tra_email.
  3. Giữ hàm ngắn. Thường vài chục dòng là đủ; dài hơn thì thử tách.
  4. Hạn chế tham số. Quá nhiều tham số là dấu hiệu hàm làm quá nhiều việc.
  5. Tránh tác dụng phụ bất ngờ, như hàm tên là "tính" nhưng lại âm thầm sửa dữ liệu toàn cục.

Hàm gọi hàm

Các hàm nhỏ có thể ghép thành hàm lớn:

def la_chan(n):
    return n % 2 == 0

def tong_so_chan(ds):
    tong = 0
    for x in ds:
        if la_chan(x):
            tong += x
    return tong

print(tong_so_chan([1, 2, 3, 4]))   # 6

Cách làm này giúp bạn giải bài toán lớn bằng cách chia nhỏ, đúng tinh thần tư duy thuật toán.

Lỗi thường gặp khi viết hàm

  1. Quên return. Hàm chạy xong nhưng trả về None, và dòng sau báo lỗi khó hiểu.
  2. Gọi hàm mà không có ngoặc. chao chỉ là tên hàm, còn chao("Lan") mới thực sự chạy.
  3. Tham số mặc định kiểu danh sách. def them(x, ds=[]) khiến mọi lần gọi dùng chung một danh sách. Hãy dùng ds=None rồi tạo danh sách mới bên trong.
  4. Sửa dữ liệu đầu vào ngoài ý muốn. Truyền danh sách vào hàm rồi gọi sort() sẽ làm thay đổi danh sách gốc của người gọi.
def them(x, ds=None):
    if ds is None:
        ds = []
    ds.append(x)
    return ds

print(them(1))   # [1]
print(them(2))   # [2], không dính [1]

Một bài tập tốt: viết các hàm nhỏ la_nguyen_to, giai_thua, dao_chuoi, rồi viết thêm hàm thứ tư gọi lại cả ba. Cách này luyện bạn chia việc thành nhiều hàm nhỏ.

Kết luận

Hàm là viên gạch xây nên mọi chương trình nghiêm túc. Hãy tập thói quen: thấy đoạn code lặp lại hoặc quá dài thì tách thành hàm có tên rõ nghĩa. Sau này khi học lập trình hướng đối tượng, bạn sẽ thấy phương thức của lớp cũng chỉ là hàm được gắn với dữ liệu.

Khi đã sẵn sàng đi sâu hơn, bạn có thể tham khảo lộ trình học trong các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment