孙赖 发表于 2020-9-10 18:59:10

写小甲鱼的作业又碰到了一个关于闭包小问题

def funX():
    x = 5
    def funY():
      nonlocal x
      x += 1
      return x
    return funY

a = funX()
print(a())
print(a())
print(a())
有一个小问题 就是为什么用闭包的话 return funY最后的funy就不用加括号了呀,这个闭包和普通的内嵌函数到底有什么区别呀,新手小白搞不明白{:5_104:}

_2_ 发表于 2020-9-10 19:04:13

对于一个函数 func, 加上括号就表示获取它的返回值
因为这里 FunY 没有括号,所以返回的是一个(内存里的)位置,
只要在外部赋值(a = FunX)然后直接加上括号就可以返回 FunY 的值了(a())

孙赖 发表于 2020-9-10 19:34:43

_2_ 发表于 2020-9-10 19:04
对于一个函数 func, 加上括号就表示获取它的返回值
因为这里 FunY 没有括号,所以返回的是一个(内存里的) ...

谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错

ljjliujunjie123 发表于 2020-9-10 20:04:56

孙赖 发表于 2020-9-10 19:34
谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错

因为如果加上了(),那么funX这个函数的返回值就是5,一个int值怎么能使用()调用呢,所以你的print(a())必然报错

Stubborn 发表于 2020-9-10 21:42:06

闭包函数,会保存一些内部的变量,比如x = 5,这个变量会被 funY所用。普通函数,运行完成后,没有局部的变量保留。

至于你说的括号问题,就像你可以把函数赋值给一个变量a = func ,然后在用a()去运行这个函数。函数也可以当做一个变量去传递的。有括号表示要运行这个函数

_2_ 发表于 2020-9-11 12:26:40

孙赖 发表于 2020-9-10 19:34
谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错

如果在内部加上括号(return FunY()), 那么就不用在外部进行 a() 了
因为 a 就是 FunY() 的返回值 5(a = FunX() 就等于 5)
那么就变成了 5() 因为 int 的实例不是 callable (你可以简单理解为 5 不是一个函数)
就会报错

Cool_Breeze 发表于 2020-9-11 15:41:49


可以把函数名看做一块代码的地址
funy():
   ......


return funy

就是把地址返回回来,你再用一个变量(a)去接收它(funy)。然后 a 就等于 funy 了! 现在就可以把 a 看做是一个函数名了!

一抹心尘 发表于 2020-10-30 18:39:34

对于一个函数 func, 加上括号就表示获取它的返回值,这个你清楚吧,然后,因为这里 FunY 没有括号,所以返回的是一个(内存里的)位置,,只要在外部赋值(a = FunX)然后直接加上括号就可以返回 FunY 的值了(a()),再其次,如果如果在内部加上括号(return FunY()), 那么就不用在外部进行 a() 了因为 a 就是 FunY() 的返回值 5(a = FunX() 就等于 5),那么就变成了 5() 因为 int 的实例不是 callable (你可以简单理解为 5 不是一个函数),就会报错。
页: [1]
查看完整版本: 写小甲鱼的作业又碰到了一个关于闭包小问题