鱼C论坛

 找回密码
 立即注册
查看: 2124|回复: 3

[已解决]嵌套函数(或称内部函数)和 闭包

[复制链接]
发表于 2023-5-23 16:23:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def funOut():
        def funIn():
                print('宾果!你成功访问到我啦!')
        return funIn

上面这个属于嵌套函数(或称内部函数)-------1


def FunX(x):
        def FunY(y):
                return x * y
        return FunY


def Fun1():
        x = 5
        def Fun2():
                x *= x
                return x
        return Fun2()

上面这两个属于闭包(由内部函数演化而来)-------2

请大神帮忙看看1和2的说法没错吧?
最佳答案
2023-5-23 19:44:00
你对内部函数和闭包的理解基本上是正确的。

对于第一个例子,确实是一个嵌套函数(或内部函数),因为在函数 funOut 中定义了另一个函数 funIn,并将其作为返回值返回。在 Python 中,内部函数就是指在一个函数体内定义的函数。

对于第二个例子,它涉及到了嵌套函数和闭包的概念。嵌套函数是在一个函数体内定义的函数,而闭包则是由内部函数和外层函数中的变量构成的一个函数对象。

在函数 FunX 中,内部函数 FunY 捕获了外层函数中的变量 x,并将其作为参数返回。这样,调用函数 FunX 返回的函数对象 FunY 就可以使用外层函数中的变量 x 了。因此,函数 FunX 返回的函数对象 FunY 就是一个闭包。

至于第二个例子中 Fun2 函数的闭包,需要稍微解释一下。在函数 Fun2 中,你尝试修改了变量 x 的值,但是这个变量是外层函数 Fun1 中的局部变量,并不是内部函数 Fun2 的自由变量(相当于被捕获的变量)。

由于变量 x 不是 Fun2 的自由变量,所以在 Fun1 中修改它的值并不会影响到 Fun2 的变量。因此,函数 Fun2 中捕获的变量 x 和外层函数 Fun1 中的变量 x 是两个不同的变量。

综上所述,内部函数和闭包都是 Python 语言中的重要特性,理解它们的概念和用法对于编写高质量的 Python 代码非常重要。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-23 16:33:33 | 显示全部楼层
在这里,你已经给出了一个嵌套函数的例子和两个闭包的例子。首先,让我们分别对它们进行解释。

嵌套函数(或称内部函数)就是函数内部定义的函数。在你的第一个例子中, funIn 就是一个嵌套函数,因为它在 funOut 函数内部定义。

然而,闭包是指那些引用了其包围范围(或称“环境”)中变量的函数,而这些变量在该函数被调用时可能已经离开了它们最初的作用域。简单来说,闭包就是一个函数和其相关的引用环境组合的一个整体(或者说数据结构)。

在你的第二个例子中, FunY 就是一个闭包,因为它引用了外部函数 FunX 的参数 x 。

然而,你的第三个例子中, Fun2 不是一个闭包。在这里, Fun2 试图修改 Fun1 中的 x ,但由于Python的变量作用域规则,这实际上是会报错的。在 Fun2 内部, x 被视为局部变量,所以它不能引用或修改外部函数 Fun1 中的 x 。要想修改 Fun1 中的 x ,需要在 Fun2 内部使用 nonlocal 关键字,如下:
def Fun1():
    x = 5
    def Fun2():
        nonlocal x
        x *= x
        return x
    return Fun2()

在这个修改后的版本中, Fun2 现在是一个闭包,因为它修改并返回了其包围环境 Fun1 中的变量 x 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-23 18:34:53 | 显示全部楼层
本帖最后由 lzb1001 于 2023-5-23 18:38 编辑
isdkz 发表于 2023-5-23 16:33
在这里,你已经给出了一个嵌套函数的例子和两个闭包的例子。首先,让我们分别对它们进行解释。

嵌套函数 ...


大神的意思是:

第三个例子在改造前内部函数Fun2()不是一个闭包,经过改造以后的内部函数Fun2()才是一个闭包?

冒昧的说下:

按照小甲鱼在教材中对闭包的定义和解说,我怎么感觉改造前和改造后的内部函数Fun2()都是一个闭包啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-23 19:44:00 | 显示全部楼层    本楼为最佳答案   
你对内部函数和闭包的理解基本上是正确的。

对于第一个例子,确实是一个嵌套函数(或内部函数),因为在函数 funOut 中定义了另一个函数 funIn,并将其作为返回值返回。在 Python 中,内部函数就是指在一个函数体内定义的函数。

对于第二个例子,它涉及到了嵌套函数和闭包的概念。嵌套函数是在一个函数体内定义的函数,而闭包则是由内部函数和外层函数中的变量构成的一个函数对象。

在函数 FunX 中,内部函数 FunY 捕获了外层函数中的变量 x,并将其作为参数返回。这样,调用函数 FunX 返回的函数对象 FunY 就可以使用外层函数中的变量 x 了。因此,函数 FunX 返回的函数对象 FunY 就是一个闭包。

至于第二个例子中 Fun2 函数的闭包,需要稍微解释一下。在函数 Fun2 中,你尝试修改了变量 x 的值,但是这个变量是外层函数 Fun1 中的局部变量,并不是内部函数 Fun2 的自由变量(相当于被捕获的变量)。

由于变量 x 不是 Fun2 的自由变量,所以在 Fun1 中修改它的值并不会影响到 Fun2 的变量。因此,函数 Fun2 中捕获的变量 x 和外层函数 Fun1 中的变量 x 是两个不同的变量。

综上所述,内部函数和闭包都是 Python 语言中的重要特性,理解它们的概念和用法对于编写高质量的 Python 代码非常重要。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 11:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表