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 教程