Một hàm lồng nhau chỉ đơn giản là một hàm bên trong một hàm khác và đôi khi được gọi là “hàm bên trong”. Có nhiều lý do khiến bạn muốn sử dụng các hàm lồng nhau và chúng ta sẽ xem xét những lý do phổ biến nhất trong bài viết này.
Cách xác định hàm lồng nhau
Để xác định một hàm lồng nhau, chỉ cần khởi tạo một hàm khác trong một hàm bằng cách sử dụng def
từ khóa:
def greeting(first, last):
# nested helper function
def getFullName():
return first + " " + last
print("Hi, " + getFullName() + "!")
greeting('Quincy', 'Larson')
Đầu ra:
Hi, Quincy Larson!
Như bạn có thể thấy, lồng nhau getFullName
chức năng có quyền truy cập vào bên ngoài greeting
tham số của hàm, first
và last
. Đây là trường hợp sử dụng phổ biến cho các hàm lồng nhau–để phục vụ như một hàm trợ giúp nhỏ cho một hàm bên ngoài phức tạp hơn.
Lý do nên sử dụng các hàm lồng nhau
Mặc dù có nhiều lý do hợp lệ để sử dụng các hàm lồng nhau, trong số những lý do phổ biến nhất là đóng gói và đóng/hàm xuất xưởng.
Đóng gói dữ liệu
Đôi khi bạn muốn ngăn không cho một chức năng hoặc dữ liệu mà nó có quyền truy cập được truy cập từ các phần khác trong mã của bạn, vì vậy bạn có thể đóng gói nó trong một chức năng khác.
Khi bạn lồng một hàm như thế này, nó sẽ ẩn khỏi phạm vi toàn cầu. Vì hành vi này, đóng gói dữ liệu đôi khi được gọi là ẩn dữ liệu hoặc bảo mật dữ liệu. Ví dụ:
def outer():
print("I'm the outer function.")
def inner():
print("And I'm the inner function.")
inner()
inner()
Đầu ra:
Traceback (most recent call last):
File "main.py", line 16, in <module>
inner()
NameError: name 'inner' is not defined
Trong đoạn mã trên, inner
chức năng chỉ có sẵn từ bên trong chức năng outer
. Nếu bạn cố gọi inner
từ bên ngoài chức năng, bạn sẽ gặp lỗi ở trên.
Thay vào đó, bạn phải gọi outer
chức năng như vậy:
def outer():
print("I'm the outer function.")
def inner():
print("And I'm the inner function.")
inner()
outer()
Đầu ra:
I'm the outer function.
And I'm the inner function.
đóng cửa
Nhưng điều gì sẽ xảy ra nếu hàm bên ngoài trả về chính hàm bên trong, thay vì gọi nó như trong ví dụ trên? Trong trường hợp đó, bạn sẽ có cái được gọi là đóng cửa.
Sau đây là các điều kiện bắt buộc phải đáp ứng để tạo bao đóng trong Python:
Đây là những điều kiện bạn cần để tạo một bao đóng trong Python:
1. Phải có hàm lồng nhau
2. Hàm bên trong phải tham chiếu đến một giá trị được xác định trong phạm vi kèm theo
3. Hàm kèm theo phải trả về hàm lồng nhau
– Nguồn: https://stackabuse.com/python-nested-functions/
Đây là một ví dụ đơn giản về việc đóng cửa:
def num1(x):
def num2(y):
return x + y
return num2
print(num1(10)(5))
Đầu ra:
15
Các bao đóng giúp có thể truyền dữ liệu vào các hàm bên trong mà không cần chuyển chúng đến các hàm bên ngoài trước với các tham số như greeting
ví dụ ở đầu bài. Chúng cũng cho phép gọi hàm bên trong từ bên ngoài hàm bên ngoài đóng gói. Tất cả điều này với lợi ích của việc đóng gói/ẩn dữ liệu đã đề cập trước đó.
Bây giờ bạn đã hiểu cách thức và lý do lồng các hàm trong Python, hãy ra ngoài và lồng chúng với những chức năng tốt nhất.