Python 中嵌套函数是如何工作的?


在本文中,我们将解释 Python 中的嵌套/内部函数以及它们如何通过示例工作。

嵌套(或内部)函数是在其他函数内定义的函数,它们允许我们直接访问封闭函数中定义的变量和名称。嵌套函数可用于创建闭包和装饰器等。

定义内部/嵌套函数

只需使用 def 关键字在函数内初始化另一个函数即可定义一个嵌套函数。

以下程序演示了 Python 中的内部函数:

示例

# creating an outer function def outerFunc(sample_text): sample_text = sample_text # creating an inner function def innerFunc(): # Printing the variable of the parent class(outer class) print(sample_text) # calling inner function innerFunc() # Calling the outer Function by passing some random name outerFunc('Hello tutorialspoint python')

输出

执行上述程序后,将生成以下输出:

Hello tutorialspoint python

这里,innerFunc()outerFunc() 内部声明,使其成为一个内部函数。在调用 innerFunc() 之前,我们必须先调用 outerFunc()。然后,outerFunc() 将调用在其内部定义的 innerFunc()

必须调用外部函数才能执行内部函数。

不调用外部函数

示例

# creating an outer function def outerFunc(sample_text): sample_text = sample_text # creating an inner function def innerFunc(): print(sample_text) # calling inner function innerFunc()

输出

执行上述程序后,将生成以下输出:


运行上述代码时,将不会返回任何结果。

嵌套函数中变量的作用域

变量的作用域是我们可以在其中找到变量并在必要时访问它的位置。

如何在函数内访问全局变量是众所周知的,但如何访问外部函数的变量呢?

以下程序演示了嵌套函数的作用域:

示例

# creating an outer function def outerFunc(): sample_str = 'Hello tutorialspoint python' # creating an inner function def innerFunc(): print(sample_str) # calling an inner function inside the outer function innerFunc() # calling outer function outerFunc()

输出

执行上述程序后,将生成以下输出:

Hello tutorialspoint python

从以上示例可以清楚地看出,它等效于从函数访问全局变量。

假设您希望修改外部函数的变量。

示例

以下程序更改嵌套函数(内部函数)内变量的值:

# creating an outer function def outerFunc(): sample_str = 'Hello tutorialspoint python' # creating an inner function def innerFunc(): # modifying the sample string sample_str = 'Welcome' print(sample_str) # calling an inner function inside the outer function innerFunc() print(sample_str) # calling outer function outerFunc()

输出

执行上述程序后,将生成以下输出:

Welcome
Hello tutorialspoint python

这里,外部函数的变量值保持不变。但是,可以修改外部函数的变量值。有多种方法可以更改外部函数的变量值。

使用内部函数的可迭代对象

以下程序演示了如何在内部函数中修改可迭代对象:

# Creating outer function def outerFunc(): # Creating an iterable sample_str = ['Hello tutorialspoint python'] # Creating inner Function/Nested Function def innerFunc(): # using an iterable to modify the value sample_str[0] = 'Welcome' print(sample_str) # Calling the inner function innerFunc() # Printing variable of the outer function print(sample_str) # Calling the outer function outerFunc()

输出

执行上述程序后,将生成以下输出:

['Welcome']
['Welcome']

为什么要使用嵌套函数?

封装和闭包/工厂函数是使用嵌套函数最常见的两个原因。

数据封装

在某些情况下,您希望封装函数或其可以访问的数据,以防止从代码的其他部分访问它。

当您像这样嵌套函数时,它对全局作用域隐藏起来。由于此特性,数据封装也称为数据隐藏或数据隐私。

# creating an outer function def outerFunc(): print("This is outer function") # creating an inner function def innerFunc(): print("This is inner function") # calling an inner function inside the outer function innerFunc() # calling inner function outside the outer function innerFunc()

输出

执行上述程序后,将生成以下输出:

Traceback (most recent call last):
  File "main.py", line 11, in <module>
    innerFunc()
NameError: name 'innerFunc' is not defined

上面代码中的内部函数只能从外部函数内部访问。如果尝试从外部函数外部调用内部函数,您将看到上面显示的错误。

相反,您必须按如下方式调用外部函数。

# creating an outer function def outerFunc(): print("This is outer function") # creating an inner function def innerFunc(): print("This is inner function") # calling an inner function inside the outer function innerFunc() # calling outer function outerFunc()

输出

执行上述程序后,将生成以下输出:

This is outer function
This is inner function

闭包

但是,如果外部函数返回内部函数本身,而不是像前面的示例那样调用它呢?在这种情况下,您将拥有称为闭包的内容。

在 Python 中创建闭包必须满足以下条件。

  • 需要一个嵌套函数。

  • 内部函数必须引用在封闭作用域中定义的值。

  • 嵌套函数必须由封闭函数返回。

示例

def number_1(a): def number_2(b): return a*b return number_2 print(number_1(3)(2))

输出

执行上述程序后,将生成以下输出:

6

闭包允许您将数据传递给内部函数,而无需先使用参数将其传递给外部函数。它们还允许从封装外部函数外部调用内部函数。所有这些都具有前面提到的数据封装/隐藏的优势。

结论

本文向我们介绍了内部函数、嵌套函数的目的、它们的工作原理以及 Python 中嵌套函数的作用域。

从这里开始学习 Python:Python 教程

更新于:2023-09-28

7K+ 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告