鱼C论坛

 找回密码
 立即注册
查看: 2084|回复: 14

[已解决]闭包函数内是否可以嵌多个内层函数?

[复制链接]
发表于 2023-7-20 15:40:10 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 10 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-20 15:40:43 | 显示全部楼层    本楼为最佳答案   
首先,你的代码中确实已经定义了两个内层函数funcA和funcB,这在Python中是完全可以的,我们可以在一个函数内部定义任意数量的其他函数。

但是,func1和func2是两个不同的闭包实例,他们各自保持着不同的环境,即两个不同的变量x和y的值。这就是为什么你的代码中,func1和func2不能相互影响的原因。在Python中,闭包函数只能获取到它们在被定义时所在的环境。

然而,如果你希望func1和func2能相互影响,即共享同一对变量x和y的值,可以将这一对变量定义在一个更外层的作用域中。下面是一个可能的改进:
def funcInit(x = 0, y = 0):    def innerFunc(type):        nonlocal x, y        def funcA(xA, yA):            nonlocal x, y            x += xA            y += yA            print("funcA:", x, y)        def funcB(xB, yB):            nonlocal x, y            x += xB            y += yB            print("funcB:", x, y)        if type == 0:            return funcA        elif type == 1:            return funcB    return innerFuncfuncFactory = funcInit()func1 = funcFactory(0)func2 = funcFactory(1)func1(1, 1)func2(2, 2)func1(3, 3)
在这个修改版的代码中,我们引入了一个额外的函数 innerFunc ,并把变量x和y移到了 funcInit 的作用域内。因此, func1 和 func2 现在共享同一个 x 和 y ,从而实现了互相影响的目的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:41:50 | 显示全部楼层
本帖最后由 学习编程中的Ben 于 2023-7-20 15:43 编辑

求给个最佳答案呗

是的,闭包函数内可以嵌套多个内层函数。在Python中,函数可以被定义在其他函数内部,这样的函数就是内部函数或嵌套函数。内部函数可以访问外部函数中的变量,并且可以通过闭包的方式保持对这些变量的引用。

以下是一个例子:
def outer_func(x):
    def inner_func1(y):
        return x + y
    
    def inner_func2(z):
        return x - z
    
    return inner_func1, inner_func2

func1, func2 = outer_func(10)
print(func1(5))  # 输出 15
print(func2(3))  # 输出 7


在这个例子中,`outer_func` 是外部函数,它接受参数 `x` 并返回两个内部函数 `inner_func1` 和 `inner_func2`。这两个内部函数分别实现了对 `x` 进行加法和减法运算。通过调用 `outer_func` 并将其返回的两个内部函数赋值给变量 `func1` 和 `func2`,我们可以分别调用它们来执行特定的计算操作。

希望这个例子能够帮助您理解闭包函数中嵌套多个内层函数的概念。如果您还有其他问题,请随时提问!


此回答源于ChatGPT,若有不正确之处,请多包容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:43:43 | 显示全部楼层
Python 的闭包可以包含多个内部函数,并且这些内部函数可以访问和修改外部函数的局部变量。但是,你的代码中的 `func1` 和 `func2` 是由不同的 `funcInit` 调用生成的,这意味着它们有自己独立的 `x` 和 `y` 变量,所以它们不能相互影响。

如果你希望 `func1` 和 `func2` 能共享同一个 `x` 和 `y`,你可以将 `funcInit` 只调用一次,然后返回一个包含 `funcA` 和 `funcB` 的字典或元组,如下所示:
def funcInit(x = 0, y = 0):
    def funcA(xA, yA):
        nonlocal x,y
        x += xA
        y += yA
        print("funcA:",x,y)
        return (x, y)
    def funcB(xB, yB):
        nonlocal x,y
        x += xB
        y += yB
        print("funcB:",x,y)
        return (x, y)
    return {'funcA': funcA, 'funcB': funcB}

funcs = funcInit()

func1 = funcs['funcA']
func2 = funcs['funcB']

func1(1, 1)
func2(2, 2)
func1(3, 3)

在这个代码中,`func1` 和 `func2` 都是由同一个 `funcInit` 调用返回的,所以它们共享同一个 `x` 和 `y`。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:44:13 | 显示全部楼层
学习编程中的Ben 发表于 2023-7-20 15:41
求给个最佳答案呗

是的,闭包函数内可以嵌套多个内层函数。在Python中,函数可以被定义在其他 ...

@isdkz 非VIP看不到帖子内容,也就没有回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:45:36 | 显示全部楼层
sfqxx 发表于 2023-7-20 15:44
@isdkz 非VIP看不到帖子内容,也就没有回答

刚刚回了啥?他改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:46:43 | 显示全部楼层
isdkz 发表于 2023-7-20 15:45
刚刚回了啥?他改了

他把非代码形式(```)改成了代码样式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:51:41 | 显示全部楼层
非常抱歉,由于技术原因,我无法运行带有代码块的请求。但是,我可以解释一下你提供的代码示例的工作原理。

在这个修改版的代码中,`funcInit` 函数接受了两个参数 `x` 和 `y`,并返回了一个名为 `innerFunc` 的嵌套函数。`innerFunc` 函数具有一个形参 `type`,用于决定返回的是 `funcA` 函数还是 `funcB` 函数。

`funcA` 和 `funcB` 都是闭包函数,它们内部可以访问并修改 `x` 和 `y` 的值。通过使用 `nonlocal` 关键字,将 `x` 和 `y` 标记为非局部变量,从而可以在内层函数中修改外部的变量。

通过调用 `funcFactory` 函数,并传入参数 `0` 或 `1`,可以分别获取到 `funcA` 和 `funcB` 这两个内嵌的闭包函数。然后,可以使用这两个函数来操作并打印出 `x` 和 `y` 的值。

请注意,在实际运行代码之前,你需要使用正确的语法和正确的参数调用函数,例如:

```python
funcFactory = funcInit()
func1 = funcFactory(0)
func2 = funcFactory(1)
func1(1, 1)  # 输出 funcA: 1 1
func2(2, 2)  # 输出 funcB: 2 2
func1(3, 3)  # 输出 funcA: 4 4
```

希望这样解释能够帮助到你!如果你有任何其他问题,请随时提问。
求给个最佳答案呗

此回答源于ChatGPT,若有不正确之处,请多包容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:51:50 | 显示全部楼层
sfqxx 发表于 2023-7-20 15:46
他把非代码形式(```)改成了代码样式

我懂了,他看不到内容是根据标题答的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-20 15:54:04 | 显示全部楼层
isdkz 发表于 2023-7-20 15:40
首先,你的代码中确实已经定义了两个内层函数funcA和funcB,这在Python中是完全可以的,我们可以在一个函数 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-20 15:54:37 | 显示全部楼层
isdkz 发表于 2023-7-20 15:51
我懂了,他看不到内容是根据标题答的

你们在聊啥,看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 15:56:19 | 显示全部楼层
SURONG0808 发表于 2023-7-20 15:54
你们在聊啥,看不懂

我们挂了机器人,但是你设置了付费主题,因为他不是vip,所以他不能直接读取到你帖子里的代码,所以有点答非所问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-20 15:57:53 | 显示全部楼层
sfqxx 发表于 2023-7-20 15:43
Python 的闭包可以包含多个内部函数,并且这些内部函数可以访问和修改外部函数的局部变量。但是,你的代码 ...

大佬你这也阔以哇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-20 16:01:58 | 显示全部楼层
isdkz 发表于 2023-7-20 15:56
我们挂了机器人,但是你设置了付费主题,因为他不是vip,所以他不能直接读取到你帖子里的代码,所以有点 ...

机器人?6,不懂。
好像有点乌龙,第一次发帖,我是打算付10鱼币的,没想到是设置了收10鱼币。谢谢大佬了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-20 16:04:15 | 显示全部楼层
SURONG0808 发表于 2023-7-20 16:01
机器人?6,不懂。
好像有点乌龙,第一次发帖,我是打算付10鱼币的,没想到是设置了收10鱼币。谢谢大佬 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 08:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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