Giới thiệu về cơ chế hàm
Hàm (function) là thành phần cốt lõi giúp lập trình viên tổ chức mã nguồn thành các khối logic độc lập và có thể tái sử dụng. Việc sử dụng hàm giúp giảm thiểu sự trùng lặp code, tăng tính модуlar và dễ dàng bảo trì hệ thống. Bài viết này sẽ đi sâu vào cách khai báo, truyền tham số, xử lý kết quả trả về cũng như quản lý phạm vi biến trong Python.
1. Khai báo và cú pháp cơ bản
Để định nghĩa một hàm, chúng ta sử dụng từ khóa def followed by tên hàm và danh sách tham số trong ngoặc đơn. Khối lệnh bên trong hàm sẽ thực thi khi hàm được gọi.
def ten_ham(tham_so):
# Khối lệnh thực thi
ket_qua = tham_so * 2
return ket_qua # Trả về giá trị (tùy chọn)
Dưới đây là ví dụ minh họa cho hàm không tham số và hàm có xử lý dữ liệu:
# Hàm không tham số, không trả về
def chao_mung():
print("Xin chào người dùng!")
chao_mung()
# Hàm có tham số và trả về kết quả
def tinh_tong(x, y):
return x + y
ket_qua = tinh_tong(10, 20)
print(ket_qua) # Output: 30
2. Các phương thức truyền tham số
Python hỗ trợ nhiều cách linh hoạt để truyền dữ liệu vào hàm, giúp tăng tính tiện lợi khi gọi hàm.
2.1. Tham số vị trí (Positional Arguments)
Giá trị truyền vào sẽ được gán theo thứ tự khai báo. Số lượng đối số phải khớp với số lượng tham số.
def hien_thi_thong_tin(ma_sv, ten_sv):
print(f"ID: {ma_sv}, Ten: {ten_sv}")
hien_thi_thong_tin(101, "Nguyen Van A") # Đúng thứ tự
# hien_thi_thong_tin(101) # Lỗi: thiếu tham số
2.2. Tham số từ khóa (Keyword Arguments)
Cho phép chỉ định tên tham số khi gọi, giúp bỏ qua thứ tự khai báo ban đầu.
def dang_ky_hoc_phan(mon_hoc, so_tin):
print(f"Mon: {mon_hoc}, Tin: {so_tin}")
dang_ky_hoc_phan(so_tin=3, mon_hoc="Toan Cao Cap") # Thứ tự có thể đảo
2.3. Tham số mặc định (Default Arguments)
Cho phép gán giá trị sẵn cho tham số. Nếu người gọi không truyền giá trị, giá trị mặc định sẽ được sử dụng.
def ket_noi_may_chu(host, port=8080):
print(f"Connecting to {host}:{port}")
ket_noi_may_chu("192.168.1.1") # Port mặc định là 8080
ket_noi_may_chu("192.168.1.1", 443) # Port bị ghi đè thành 443
2.4. Tham số biến động (Variable-length Arguments)
Sử dụng *args để nhận nhiều giá trị vị trí dưới dạng tuple và **kwargs để nhận nhiều giá trị từ khóa dưới dạng dictionary.
# Nhận nhiều đối số vị trí
def tong_nhieu_so(*so_lieu):
return sum(so_lieu)
print(tong_nhieu_so(1, 2, 3, 4)) # Output: 10
# Nhận nhiều đối số từ khóa
def in_cau_hinh(**tuy_chinh):
for key, value in tuy_chinh.items():
print(f"{key}: {value}")
in_cau_hinh(theme="dark", font_size=14)
3. Xử lý giá trị trả về
Lệnh return dùng để gửi kết quả về nơi gọi hàm và kết thúc ngay lập tức quá trình thực thi của hàm đó. Nếu không có return, hàm sẽ trả về None.
def kiem_tra_so_chan(n):
if n % 2 == 0:
return True
return False
# Trả về nhiều giá trị cùng lúc (dưới dạng tuple)
def lay_thong_tin_user():
return "Admin", 1234, True
ten, ma, trang_thai = lay_thong_tin_user()
print(ten, ma, trang_thai)
4. Gọi hàm lồng nhau và phạm vi biến
Hàm có thể được gọi bên trong một hàm khác. Về phạm vi biến, biến khai báo trong hàm là biến cục bộ (local), chỉ tồn tại trong hàm đó. Biến khai báo ngoài hàm là biến toàn cục (global).
4.1. Ví dụ về gọi hàm lồng nhau
def xu_ly_du_thieu(a, b):
return a - b
def tinh_toan_phuc_tap(x, y):
tong = x + y
hieu = xu_ly_du_thieu(x, y)
return tong * hieu
print(tinh_toan_phuc_tap(10, 5))
4.2. Quản lý biến cục bộ và toàn cục
dem = 0 # Biến toàn cục
def tang_dem():
global dem # Khai báo sử dụng biến toàn cục
dem += 1
tang_dem()
print(dem) # Output: 1
def tao_biencucbo():
tmp = 100 # Biến cục bộ
return tmp
# print(tmp) # Lỗi: Không thể truy cập biến cục bộ bên ngoài
5. Hàm ẩn danh (Lambda)
Lambda cho phép tạo các hàm nhỏ gọn chỉ gồm một biểu thức mà không cần dùng từ khóa def. Thường được sử dụng làm đối số cho các hàm xử lý danh sách.
# Tính bình phương
binh_phuong = lambda x: x ** 2
print(binh_phuong(5)) # Output: 25
# Sắp xếp danh sách sản phẩm theo giá
san_pham = [
{"ten": "Laptop", "gia": 2000},
{"ten": "Chuot", "gia": 50},
{"ten": "Ban phim", "gia": 150}
]
san_pham.sort(key=lambda item: item["gia"])
print(san_pham)
6. Một số lưu ý quan trọng
- Tham số vị trí bắt buộc phải đứng trước tham số từ khóa khi gọi hàm.
- Tham số có giá trị mặc định phải được khai báo sau các tham số bắt buộc trong định nghĩa hàm.
- Muốn thay đổi giá trị biến toàn cục bên trong hàm, bắt buộc phải sử dụng từ khóa
global. - Code nằm sau lệnh
returntrong cùng một khối sẽ không bao giờ được thực thi. - Hàm Lambda chỉ chấp nhận một biểu thức duy nhất, logic phức tạp nên định nghĩa bằng hàm thường.