SURONG0808 发表于 2023-7-20 15:40:10

本主题需向作者支付 10 鱼币 才能浏览 购买主题

isdkz 发表于 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 innerFunc

funcFactory = funcInit()

func1 = funcFactory(0)
func2 = funcFactory(1)

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


在这个修改版的代码中,我们引入了一个额外的函数 innerFunc ,并把变量x和y移到了 funcInit 的作用域内。因此, func1 和 func2 现在共享同一个 x 和 y ,从而实现了互相影响的目的。

学习编程中的Ben 发表于 2023-7-20 15:41:50

本帖最后由 学习编程中的Ben 于 2023-7-20 15:43 编辑

求给个最佳答案呗{:10_254:}

是的,闭包函数内可以嵌套多个内层函数。在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,若有不正确之处,请多包容

sfqxx 发表于 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`。

求最佳答案{:10_254:}

sfqxx 发表于 2023-7-20 15:44:13

学习编程中的Ben 发表于 2023-7-20 15:41
求给个最佳答案呗

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

@isdkz 非VIP看不到帖子内容,也就没有回答{:10_256:}

isdkz 发表于 2023-7-20 15:45:36

sfqxx 发表于 2023-7-20 15:44
@isdkz 非VIP看不到帖子内容,也就没有回答

刚刚回了啥?他改了

sfqxx 发表于 2023-7-20 15:46:43

isdkz 发表于 2023-7-20 15:45
刚刚回了啥?他改了

他把非代码形式(```)改成了代码样式

学习编程中的Ben 发表于 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
```

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

此回答源于ChatGPT,若有不正确之处,请多包容

isdkz 发表于 2023-7-20 15:51:50

sfqxx 发表于 2023-7-20 15:46
他把非代码形式(```)改成了代码样式

我懂了,他看不到内容是根据标题答的

SURONG0808 发表于 2023-7-20 15:54:04

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

{:9_229:}

SURONG0808 发表于 2023-7-20 15:54:37

isdkz 发表于 2023-7-20 15:51
我懂了,他看不到内容是根据标题答的

你们在聊啥,看不懂

isdkz 发表于 2023-7-20 15:56:19

SURONG0808 发表于 2023-7-20 15:54
你们在聊啥,看不懂

我们挂了机器人,但是你设置了付费主题,因为他不是vip,所以他不能直接读取到你帖子里的代码,所以有点答非所问

SURONG0808 发表于 2023-7-20 15:57:53

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

大佬你这也阔以哇

SURONG0808 发表于 2023-7-20 16:01:58

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

机器人?6,不懂。
好像有点乌龙,第一次发帖,我是打算付10鱼币的,没想到是设置了收10鱼币。谢谢大佬了

sfqxx 发表于 2023-7-20 16:04:15

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

{:10_266:}
页: [1]
查看完整版本: 闭包函数内是否可以嵌多个内层函数?