Trong lập trình Python, hàm số là một khái niệm quan trọng và cơ bản, giúp tổ chức mã nguồn và thực hiện các tác vụ lặp đi lặp lại một cách hiệu quả. Hàm là một đoạn mã có thể nhận đầu vào (tham số), thực hiện một số thao tác và trả về kết quả. Sử dụng hàm trong Python không chỉ giúp làm mã trở nên rõ ràng và dễ bảo trì mà còn giúp tái sử dụng mã trong các phần khác nhau của chương trình.
Cấu trúc cơ bản của một hàm trong Python được định nghĩa bởi từ khóa def, theo sau là tên hàm, các tham số (nếu có), và cuối cùng là phần thân hàm chứa các câu lệnh cần thực thi. Hàm trong Python có thể trả về một giá trị thông qua từ khóa return. Cấu trúc tổng quát của một hàm Python như sau:
def ten_ham(tham_so_1, tham_so_2): # Thân hàm # Các câu lệnh thực thi return gia_tri
Trong đó:
def là từ khóa để định nghĩa hàm.
ten_ham là tên của hàm, nó phải là một chuỗi ký tự hợp lệ trong Python.
tham_so_1, tham_so_2 là các tham số của hàm, chúng là các giá trị được truyền vào khi gọi hàm.
return gia_tri là phần trả về của hàm, cho phép hàm trả lại một giá trị kết quả khi thực thi xong.
Ví dụ, một hàm đơn giản trong Python có thể tính tổng của hai số như sau:
def tinh_tong(a, b): return a + b
Trong ví dụ trên, hàm tinh_tong nhận vào hai tham số a và b, sau đó trả về kết quả của phép cộng a + b. Khi gọi hàm này và truyền vào hai giá trị, Python sẽ trả về tổng của chúng.
kq = tinh_tong(3, 5) print(kq) # Kết quả là 8
Một điểm đặc biệt của Python là hàm có thể không trả về giá trị nào, trong trường hợp này Python mặc định sẽ trả về None. Ví dụ:
def in_hello(): print("Hello, World!")
Hàm in_hello không có tham số và không có câu lệnh return, vì vậy khi gọi hàm này, nó chỉ thực hiện hành động in ra "Hello, World!" mà không trả về giá trị.
in_hello() # In ra "Hello, World!"
Ngoài ra, Python hỗ trợ các tham số mặc định trong hàm. Điều này có nghĩa là nếu khi gọi hàm mà không cung cấp giá trị cho tham số đó, Python sẽ sử dụng giá trị mặc định đã được định nghĩa trước. Ví dụ:
def chao_hoi(ten="Bạn"): print("Chào", ten)
Trong ví dụ trên, nếu không truyền tham số ten, hàm sẽ mặc định sử dụng giá trị "Bạn". Nếu truyền giá trị cho tham số ten, giá trị đó sẽ được sử dụng thay cho giá trị mặc định.
chao_hoi() # In ra "Chào Bạn" chao_hoi("Nam") # In ra "Chào Nam"
Một tính năng mạnh mẽ khác của Python là khả năng truyền tham số theo kiểu không xác định số lượng (variable number of arguments). Điều này cho phép hàm nhận vào một số lượng tham số không xác định trước. Để thực hiện điều này, Python sử dụng cú pháp *args cho các tham số không tên và **kwargs cho các tham số có tên.
Khi sử dụng *args, bạn có thể truyền một số lượng tham số bất kỳ vào hàm, và chúng sẽ được gói gọn trong một tuple. Ví dụ:
def tinh_tong_nhieu(*args): return sum(args)
Hàm tinh_tong_nhieu có thể nhận bất kỳ số lượng tham số nào và trả về tổng của chúng. Khi gọi hàm với một số tham số khác nhau, Python sẽ tự động gói các tham số đó vào một tuple và tính tổng:
print(tinh_tong_nhieu(1, 2, 3)) # Kết quả là 6 print(tinh_tong_nhieu(10, 20, 30, 40)) # Kết quả là 100
Ngoài ra, **kwargs cho phép bạn truyền các tham số có tên vào hàm dưới dạng một từ điển. Ví dụ:
def in_thong_tin(**kwargs): for key, value in kwargs.items(): print(key + ":", value)
Khi gọi hàm với các tham số có tên, chúng sẽ được chuyển thành một từ điển và có thể truy cập qua kwargs. Ví dụ:
in_thong_tin(tuoi=25, dia_chi="Hà Nội", ten="Nam")
Kết quả sẽ là:
tuoi: 25 dia_chi: Hà Nội ten: Nam
Một điểm mạnh khác của Python là khả năng sử dụng hàm trong hàm. Python cho phép gọi hàm bên trong một hàm khác, điều này giúp chương trình trở nên gọn gàng và dễ hiểu hơn. Chúng ta cũng có thể sử dụng hàm trả về một hàm khác, một tính năng rất hữu ích trong lập trình hàm (functional programming). Ví dụ:
def cha(): def con(): print("Hàm con được gọi") return con
Hàm cha trả về hàm con, và bạn có thể gọi hàm này như sau:
h = cha() # Lấy hàm con h() # In ra "Hàm con được gọi"
Trong trường hợp này, hàm cha không chỉ thực hiện hành động của nó mà còn "trả về" một hàm để có thể sử dụng sau này.
Hàm là một công cụ rất mạnh mẽ trong Python, giúp lập trình viên tổ chức mã nguồn một cách có cấu trúc và dễ bảo trì. Việc chia mã thành các hàm độc lập không chỉ giúp mã trở nên dễ hiểu mà còn giúp tái sử dụng mã và dễ dàng kiểm tra, gỡ lỗi. Python hỗ trợ rất nhiều tính năng khi làm việc với hàm, từ các tham số mặc định, tham số không xác định số lượng, cho đến khả năng truyền tham số theo kiểu từ điển, giúp tăng tính linh hoạt và mở rộng của các chương trình.