Python中的嵌套函数是如何工作的?
在本文中,我们将通过示例介绍Python中带有嵌套/内部函数的概念及其工作原理。
嵌套(或内部)函数是在其他函数中定义的函数,允许我们直接访问在封闭函数中定义的变量和名称。嵌套函数可用于创建闭包和装饰器等功能。
定义内部/嵌套函数
只需使用 def 关键字初始化另一个函数到函数中定义一个 嵌套的 函数。
以下程序演示了Python中的内部函数。
更多Python相关文章,请阅读:Python 教程
示例
# 创建外部函数
def outerFunc(sample_text):
sample_text = sample_text
# 创建内部函数
def innerFunc():
# 打印父类(外部类)的变量
print(sample_text)
# 调用内部函数
innerFunc()
# 通过传递任意名称调用外部函数
outerFunc('Hello tutorialspoint python')
输出
执行上述程序将生成以下输出 –
Hello tutorialspoint python
在这里, innerFunc() 声明在 outerFunc() 中,使其成为内部函数。在调用 innerFunc() 之前,我们必须首先调用outerFunc()。然后outerFunc()将调用其中定义的innerFunc()。
必须调用外部函数,以使内部函数执行。
未调用外部函数
示例
# 创建外部函数
def outerFunc(sample_text):
sample_text = sample_text
# 创建内部函数
def innerFunc():
print(sample_text)
# 调用内部函数
innerFunc()
输出
执行上述程序将生成以下输出 –
运行上述代码时不会返回任何结果。
嵌套函数中的变量作用域
变量的作用域是我们能找到一个变量并在必要时访问它的位置。
我们已经很清楚如何在函数内部访问全局变量,但是如何访问外部函数的变量呢?
以下程序演示了嵌套函数的作用域。
示例
# 创建外部函数
def outerFunc():
sample_str = 'Hello tutorialspoint python'
# 创建内部函数
def innerFunc():
print(sample_str)
# 在外部函数内调用内部函数
innerFunc()
# 调用外部函数
outerFunc()
输出
执行上述程序将生成以下输出 –
Hello tutorialspoint python
从以上示例可以看出,从函数中访问全局变量是相当的。
假设您希望修改外部函数的变量。
例子
以下程序更改了嵌套函数(内部函数)中变量的值-
# 创建外部函数
def outerFunc():
sample_str = 'Hello tutorialspoint python'
# 创建内部函数
def innerFunc():
# 修改样本字符串
sample_str = 'Welcome'
print(sample_str)
# 在外部函数内调用内部函数
innerFunc()
print(sample_str)
# 调用外部函数
outerFunc()
输出
执行上述程序会生成以下输出-
Welcome
Hello tutorialspoint python
在这里,外部函数的变量值保持不变。但是,可以修改外部函数的变量值。有几种更改外部函数变量值的方法。
使用内部函数的可迭代对象
以下程序演示了如何在内部函数中使用修改可迭代对象-
# 创建外部函数
def outerFunc():
#创建一个可迭代对象
sample_str = ['Hello tutorialspoint python']
#创建内部函数/嵌套函数
def innerFunc():
#使用可迭代对象来修改值
sample_str[0] = 'Welcome'
print(sample_str)
#调用内部函数
innerFunc()
#打印外部函数的变量
print(sample_str)
# 调用外部函数
outerFunc()
输出
执行上述程序会生成以下输出-
['Welcome']
['Welcome']
为什么应该使用嵌套函数?
封装和闭包/工厂函数是使用嵌套函数的两个最常见原因。
数据封装
在某些情况下,您希望封装函数或其访问的数据,以防止从您代码的其他部分访问它。
当您嵌套这样的函数时,它变得对全局范围隐藏。由于这种特性,数据封装也称为数据隐藏或数据保护。
# 创建一个外部函数
def outerFunc():
print("这是外部函数")
# 创建一个内部函数
def innerFunc():
print("这是内部函数")
# 在外部函数中调用内部函数
innerFunc()
# 在外部函数外调用内部函数
innerFunc()
输出
在执行上述代码时会生成以下输出 −
Traceback (most recent call last):
File "main.py", line 11, in <module>
innerFunc()
NameError: name 'innerFunc' is not defined
上述代码中的内部函数仅可以从外部函数内部访问。如果尝试从函数外部调用内部函数,将会出现上述错误。
相反,必须按照以下方式调用外部函数。
# 创建一个外部函数
def outerFunc():
print("这是外部函数")
# 创建一个内部函数
def innerFunc():
print("这是内部函数")
# 在外部函数中调用内部函数
innerFunc()
# 调用外部函数
outerFunc()
输出
在执行上述代码时会生成以下输出 −
这是外部函数
这是内部函数
闭包
但是,如果外部函数返回内部函数本身而不是像前面的例子中那样调用它呢?在这种情况下,你会得到一个称为闭包的东西。
在 Python 中构建闭包必须满足以下条件。
- 需要嵌套函数。
-
内部函数必须引用在封闭作用域中定义的值。
-
嵌套函数必须由封闭函数返回。
示例
def number_1(a):
def number_2(b):
return a*b
return number_2
print(number_1(3)(2))
输出
在执行上述代码时会生成以下输出 −
6
闭包 允许你向内部函数传递数据,而无需先将其通过参数传递给外部函数。它们还允许从封装的外部函数外部调用内部函数。所有这些都具备先前提到的数据封装/隐藏的好处。
结论
本文向我们介绍了内部函数、嵌套函数的目的,以及它们的工作原理和 Python 中嵌套函数的作用域。