Hướng dẫn can i define a function inside a function python? - tôi có thể xác định một hàm bên trong một hàm python không?

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
0

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:

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
2

Mã 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
4

Mã 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ó.

Có thể xác định một hàm bên trong một hàm?

Chúng ta có thể khai báo một hàm bên trong một hàm, nhưng nó không phải là một hàm lồng nhau. Bởi vì các định nghĩa chức năng lồng nhau không thể truy cập các biến cục bộ của các khối xung quanh, chúng chỉ có thể truy cập các biến toàn cầu của mô -đun chứa.. Because nested functions definitions can not access local variables of the surrounding blocks, they can access only global variables of the containing module.

Một chức năng có thể được gọi từ bên trong một hàm trong Python không?

Trong Python, bất kỳ chức năng bằng văn bản nào cũng có thể được gọi bởi một hàm khác.Lưu ý rằng đây có thể là cách phá vỡ một vấn đề thanh lịch nhất thành các vấn đề nhỏ.any written function can be called by another function. Note that this could be the most elegant way of breaking a problem into chunks of small problems.

Bạn có thể xác định hai chức năng trong Python không?

Các chức năng có thể được xác định bên trong một mô -đun, một lớp hoặc chức năng khác.Hàm được xác định bên trong một lớp được gọi là một phương thức.Trong ví dụ này, chúng tôi xác định hàm F ở ba nơi khác nhau.

Một chức năng có thể có một chức năng khác bên trong?

Một hàm được xác định bên trong một hàm khác được gọi là hàm bên trong hoặc functio n lồng nhau.Các hàm lồng nhau có thể truy cập các biến của phạm vi kèm theo.Các hàm bên trong được sử dụng để chúng có thể được bảo vệ khỏi mọi thứ xảy ra bên ngoài chức năng.Quá trình này còn được gọi là đóng gói.. Nested functions are able to access variables of the enclosing scope. Inner functions are used so that they can be protected from everything happening outside the function. This process is also known as Encapsulation .