Hàm là một khối mã có thể được gọi lại nhiều lần trong chương trình, sử dụng hàm giúp tăng tính tái sử dụng và tổ chức code. Trong bài viết này, chúng ta sẽ tìm hiểu cách định nghĩa và gọi hàm trong lập trình.
Cách định nghĩa hàm trong ngôn ngữ lập trình
Để định nghĩa một hàm, chúng ta cần khai báo tên hàm, danh sách tham số (nếu có) và khối mã của hàm. Cú pháp định nghĩa hàm trong một số ngôn ngữ lập trình phổ biến:
Java
<kiểu trả về> <tên hàm>(<danh sách tham số>) {
// Khối mã của hàm
}
Ví dụ:
int tinhTong(int a, int b) {
return a + b;
}
C/C++
<kiểu trả về> <tên hàm>(<danh sách tham số>) {
// Khối mã của hàm
}
Ví dụ:
int tinhTong(int a, int b) {
return a + b;
}
Python
def <tên hàm>(<danh sách tham số>):
# Khối mã của hàm
Ví dụ:
def tinhTong(a, b):
return a + b
JavaScript
function <tên hàm>(<danh sách tham số>) {
// Khối mã của hàm
}
Ví dụ:
function tinhTong(a, b) {
return a + b;
}
Như vậy, cú pháp định nghĩa hàm trong các ngôn ngữ lập trình khá là tương đồng. Chúng ta cần khai báo tên hàm, danh sách tham số (nếu có) và khối mã bên trong hàm.
Các loại tham số trong hàm
Có hai loại tham số chính trong hàm:
-
Tham số bắt buộc: Là tham số mà người gọi hàm bắt buộc phải truyền vào. Nếu không truyền tham số này vào thì sẽ báo lỗi.
-
Tham số mặc định: Là tham số có giá trị mặc định, người gọi hàm có thể không truyền giá trị vào tham số này. Nếu không truyền giá trị vào thì tham số sẽ nhận giá trị mặc định đã khai báo.
Ví dụ về hàm có cả hai loại tham số trong Python:
def tinh_dien_tich(chieu_dai, chieu_rong, don_vi = 'm'):
dien_tich = chieu_dai * chieu_rong
if don_vi == 'm':
return dien_tich
elif don_vi == 'cm':
return dien_tich * 100
Trong đó chieu_dai và chieu_rong là tham số bắt buộc, còn don_vi là tham số mặc định có giá trị là 'm'.
Việc sử dụng tham số mặc định giúp tăng tính linh hoạt của hàm, tránh báo lỗi khi người dùng không truyền đủ tham số.
Cách gọi hàm trong chương trình
Để gọi một hàm, chúng ta sử dụng tên hàm và truyền tham số vào (nếu có). Cú pháp gọi hàm:
<tên hàm>(<danh sách tham số>)
Ví dụ gọi hàm tinhTong ở trên trong Python:
a = 1
b = 2
tong = tinhTong(a, b)
print(tong) # in ra 3
Lưu ý rằng khi gọi hàm, thứ tự và kiểu dữ liệu của tham số truyền vào phải khớp với định nghĩa hàm.
Ngoài ra, có một số cách gọi hàm nâng cao hơn:
-
Gọi hàm với tên tham số rõ ràng cho dễ đọc:
-
tong = tinhTong(a=1, b=2)
-
Gọi hàm với số lượng tham số không cố định (chỉ áp dụng cho một số ngôn ngữ như Python):
-
danh_sach = [1, 2, 3]
-
tong = tinhTong(*danh_sach)
-
Lưu hàm vào biến rồi gọi:
-
tinh_tong = tinhTong
-
tong = tinh_tong(1, 2)
Như vậy, cách gọi hàm cơ bản là sử dụng tên hàm và truyền tham số. Tùy ngôn ngữ, chúng ta có thể linh hoạt gọi hàm theo nhiều cách khác nhau.
Sử dụng các thư viện hàm có sẵn
Các ngôn ngữ lập trình thường cung cấp sẵn nhiều thư viện hàm tiện ích cho các tác vụ phổ biến như:
-
Xử lý chuỗi
-
Làm việc với ngày tháng
-
Xử lý file, thư mục
-
Vẽ đồ họa
-
Giao tiếp mạng
-
...
Thay vì tự code lại các hàm này, chúng ta có thể sử dụng các hàm có sẵn trong thư viện để tiết kiệm thời gian, công sức.
Ví dụ sử dụng hàm randint() trong thư viện random của Python để sinh số ngẫu nhiên:
from random import randint
ngau_nhien = randint(0, 100)
Hầu hết các thư viện hàm tiêu chuẩn đều được tích hợp sẵn trong ngôn ngữ lập trình, giúp lập trình viên tập trung vào phần mã chính thay vì code lại các tác vụ cơ bản. Do đó, việc tìm hiểu và sử dụng thành thạo các thư viện hàm có sẵn là kỹ năng cần thiết của một lập trình viên.
Phân biệt giữa hàm và phương thức
Hàm là khối mã độc lập, không liên kết với đối tượng nào.
Phương thức là hàm thuộc về một lớp/đối tượng nào đó. Phương thức mô tả hành vi của đối tượng.
Ví dụ:
# Hàm
def tinh_tong(a, b):
return a + b
# Phương thức
class Person:
def getName(self):
return self.name
p = Person()
p.getName() # gọi phương thức getName() của đối tượng p
Như vậy:
-
Hàm độc lập, không cần khởi tạo đối tượng mà có thể gọi.
-
Phương thức cần phải thông qua một đối tượng mới có thể gọi.
-
Tuy nhiên, trong một số ngôn ngữ (như Python), ranh giới giữa hàm và phương thức không rõ ràng. Chúng ta có thể gọi phương thức mà không cần tạo đối tượng.
Kết luận: nhìn chung, hàm và phương thức đều là các khối mã có thể tái sử dụng. Sự khác biệt chính là phương thức gắn liền với một lớp/đối tượng, còn hàm thì độc lập.