Chức năng lồng nhau là gì?
Các chức năng là một trong những "công dân hạng nhất" của Python, điều đó có nghĩa là các chức năng ở cùng cấp độ với các đối tượng Python khác như số nguyên, chuỗi, mô-đun, v.v. như các giá trị, v.v.
Python hỗ trợ khái niệm về "hàm lồng nhau" hoặc "hàm bên trong", chỉ đơn giản là một hàm được xác định bên trong một hàm khác. Trong phần còn lại của bài viết, chúng tôi sẽ sử dụng từ "hàm bên trong" và "hàm lồng nhau" thay thế cho nhau.
Có nhiều lý do là lý do tại sao người ta muốn tạo một chức năng bên trong một chức năng khác. Hàm bên trong có thể truy cập các biến trong phạm vi kèm theo. Trong bài viết này, chúng tôi sẽ khám phá các khía cạnh khác nhau của các chức năng bên trong trong Python.
Xác định hàm bên trong
Để xác định hàm bên trong trong Python, chúng tôi chỉ cần tạo một hàm bên trong một hàm khác bằng từ khóa
Hello from outer function
Hello from inner function
5 của Python. Đây là một ví dụ:def function1[]: # outer function
print ["Hello from outer function"]
def function2[]: # inner function
print ["Hello from inner function"]
function2[]
function1[]
Đầu ra
Hello from outer function
Hello from inner function
Trong ví dụ trên,
Hello from outer function
Hello from inner function
6 đã được xác định bên trong Hello from outer function
Hello from inner function
7, làm cho nó trở thành một hàm bên trong. Để gọi Hello from outer function
Hello from inner function
6, trước tiên chúng ta phải gọi Hello from outer function
Hello from inner function
7. Hello from outer function
Hello from inner function
7 sau đó sẽ đi trước và gọi Hello from outer function
Hello from inner function
6 vì nó đã được xác định bên trong nó.Điều quan trọng là phải đề cập rằng hàm bên ngoài phải được gọi để chức năng bên trong thực thi. Nếu hàm bên ngoài không được gọi, hàm bên trong sẽ không bao giờ thực thi. Để chứng minh điều này, hãy sửa đổi mã trên thành phần sau và chạy nó:
def function1[]: # outer function
print ["Hello from outer function"]
def function2[]: # inner function
print ["Hello from inner function"]
function2[]
Mã sẽ không trả về không có gì khi được thực thi!
Đây là một ví dụ khác:
def num1[x]:
def num2[y]:
return x * y
return num2
res = num1[10]
print[res[5]]
Đầu ra
50
Trong ví dụ trên,
Hello from outer function
Hello from inner function
6 đã được xác định bên trong Hello from outer function
Hello from inner function
7, làm cho nó trở thành một hàm bên trong. Để gọi Hello from outer function
Hello from inner function
6, trước tiên chúng ta phải gọi Hello from outer function
Hello from inner function
7. Hello from outer function
Hello from inner function
7 sau đó sẽ đi trước và gọi Hello from outer function
Hello from inner function
6 vì nó đã được xác định bên trong nó.Điều quan trọng là phải đề cập rằng hàm bên ngoài phải được gọi để chức năng bên trong thực thi. Nếu hàm bên ngoài không được gọi, hàm bên trong sẽ không bao giờ thực thi. Để chứng minh điều này, hãy sửa đổi mã trên thành phần sau và chạy nó:
def function1[]: # outer function
x = 2 # A variable defined within the outer function
def function2[a]: # inner function
# Let's define a new variable within the inner function
# rather than changing the value of x of the outer function
x = 6
print [a+x]
print [x] # to display the value of x of the outer function
function2[3]
function1[]
Đầu ra
2
9
Trong ví dụ trên,
Hello from outer function
Hello from inner function
6 đã được xác định bên trong Hello from outer function
Hello from inner function
7, làm cho nó trở thành một hàm bên trong. Để gọi Hello from outer function
Hello from inner function
6, trước tiên chúng ta phải gọi Hello from outer function
Hello from inner function
7. Hello from outer function
Hello from inner function
7 sau đó sẽ đi trước và gọi Hello from outer function
Hello from inner function
6 vì nó đã được xác định bên trong nó.Điều quan trọng là phải đề cập rằng hàm bên ngoài phải được gọi để chức năng bên trong thực thi. Nếu hàm bên ngoài không được gọi, hàm bên trong sẽ không bao giờ thực thi. Để chứng minh điều này, hãy sửa đổi mã trên thành phần sau và chạy nó:
Mã sẽ không trả về không có gì khi được thực thi!
Đây là một ví dụ khác:
Mã trả về phép nhân của hai số, nghĩa là 10 và 5. Ví dụ cho thấy hàm bên trong có thể truy cập các biến có thể truy cập ở hàm bên ngoài.
Cho đến nay, bạn đã thấy rằng chúng tôi có thể truy cập các biến của hàm bên ngoài bên trong hàm bên trong. Điều gì sẽ xảy ra nếu chúng ta cố gắng thay đổi các biến của hàm bên ngoài từ bên trong hàm bên trong? Hãy cho chúng tôi xem những gì xảy ra:
def outer_function[x]:
# Hidden from the outer code
def inner_increment[x]:
return x + 2
y = inner_increment[x]
print[x, y]
inner_increment[5]
#outer_function[5]
Đầu ra
Traceback [most recent call last]:
File "C:/Users/admin/inner.py", line 7, in
inner_increment[5]
NameError: name 'inner_increment' is not defined
Trong ví dụ trên,
Hello from outer function
Hello from inner function
6 đã được xác định bên trong Hello from outer function
Hello from inner function
7, làm cho nó trở thành một hàm bên trong. Để gọi Hello from outer function
Hello from inner function
6, trước tiên chúng ta phải gọi Hello from outer function
Hello from inner function
7. Hello from outer function
Hello from inner function
7 sau đó sẽ đi trước và gọi Hello from outer function
Hello from inner function
6 vì nó đã được xác định bên trong nó.Điều quan trọng là phải đề cập rằng hàm bên ngoài phải được gọi để chức năng bên trong thực thi. Nếu hàm bên ngoài không được gọi, hàm bên trong sẽ không bao giờ thực thi. Để chứng minh điều này, hãy sửa đổi mã trên thành phần sau và chạy nó:
def outer_function[x]:
# Hidden from the outer code
def inner_increment[x]:
return x + 2
y = inner_increment[x]
print[x, y]
#inner_increment[5]
outer_function[5]
Đầu ra
Hello from outer function
Hello from inner function
0Trong ví dụ trên,
Hello from outer function
Hello from inner function
6 đã được xác định bên trong Hello from outer function
Hello from inner function
7, làm cho nó trở thành một hàm bên trong. Để gọi Hello from outer function
Hello from inner function
6, trước tiên chúng ta phải gọi Hello from outer function
Hello from inner function
7. Hello from outer function
Hello from inner function
7 sau đó sẽ đi trước và gọi Hello from outer function
Hello from inner function
6 vì nó đã được xác định bên trong nó.Điều quan trọng là phải đề cập rằng hàm bên ngoài phải được gọi để chức năng bên trong thực thi. Nếu hàm bên ngoài không được gọi, hàm bên trong sẽ không bao giờ thực thi. Để chứng minh điều này, hãy sửa đổi mã trên thành phần sau và chạy nó:
Mã sẽ không trả về không có gì khi được thực thi!
Đây là một ví dụ khác:
Mã trả về phép nhân của hai số, nghĩa là 10 và 5. Ví dụ cho thấy hàm bên trong có thể truy cập các biến có thể truy cập ở hàm bên ngoài.
Cho đến nay, bạn đã thấy rằng chúng tôi có thể truy cập các biến của hàm bên ngoài bên trong hàm bên trong. Điều gì sẽ xảy ra nếu chúng ta cố gắng thay đổi các biến của hàm bên ngoài từ bên trong hàm bên trong? Hãy cho chúng tôi xem những gì xảy ra:
Sau đây là các điều kiện được yêu cầu phải đáp ứng để tạo ra một đóng cửa trong Python:
- Phải có một chức năng lồng nhau
- Hàm bên trong phải đề cập đến một giá trị được xác định trong phạm vi kèm theo
- Hàm kèm theo phải trả về chức năng lồng nhau
Xem xét ví dụ sau:
Hello from outer function
Hello from inner function
1Đầu ra
Hello from outer function
Hello from inner function
2Mã trên chứng minh rằng với việc đóng cửa, chúng tôi có thể tạo và gọi một hàm từ bên ngoài phạm vi của nó thông qua chức năng đi qua. Phạm vi của
Hello from outer function
Hello from inner function
6 chỉ ở trong Hello from outer function
Hello from inner function
7. Tuy nhiên, với việc sử dụng đóng cửa, chúng tôi có thể mở rộng phạm vi này và gọi nó từ bên ngoài phạm vi của nó.Các chức năng bên trong giúp chúng tôi xác định các chức năng của nhà máy. Một chức năng nhà máy là một chức năng tạo ra một đối tượng khác. Ví dụ:
Hello from outer function
Hello from inner function
3Đầu ra
Hello from outer function
Hello from inner function
4Mã trên chứng minh rằng với việc đóng cửa, chúng tôi có thể tạo và gọi một hàm từ bên ngoài phạm vi của nó thông qua chức năng đi qua. Phạm vi của
Hello from outer function
Hello from inner function
6 chỉ ở trong Hello from outer function
Hello from inner function
7. Tuy nhiên, với việc sử dụng đóng cửa, chúng tôi có thể mở rộng phạm vi này và gọi nó từ bên ngoài phạm vi của nó.Các chức năng bên trong giúp chúng tôi xác định các chức năng của nhà máy. Một chức năng nhà máy là một chức năng tạo ra một đối tượng khác. Ví dụ:
Trong tập lệnh trên, từ hàm
def num1[x]:
def num2[y]:
return x * y
return num2
res = num1[10]
print[res[5]]
6, chúng tôi đã tạo hai đối tượng khác, def num1[x]:
def num2[y]:
return x * y
return num2
res = num1[10]
print[res[5]]
7 và def num1[x]:
def num2[y]:
return x * y
return num2
res = num1[10]
print[res[5]]
8. Điều này làm cho def num1[x]:
def num2[y]:
return x * y
return num2
res = num1[10]
print[res[5]]
6 trở thành một chức năng nhà máy vì nó tạo ra các hàm def num1[x]:
def num2[y]:
return x * y
return num2
res = num1[10]
print[res[5]]
7 và def num1[x]:
def num2[y]:
return x * y
return num2
res = num1[10]
print[res[5]]
8 cho chúng tôi bằng cách sử dụng tham số chúng tôi vượt qua nó.