写小甲鱼的作业又碰到了一个关于闭包小问题
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:} 对于一个函数 func, 加上括号就表示获取它的返回值
因为这里 FunY 没有括号,所以返回的是一个(内存里的)位置,
只要在外部赋值(a = FunX)然后直接加上括号就可以返回 FunY 的值了(a()) _2_ 发表于 2020-9-10 19:04
对于一个函数 func, 加上括号就表示获取它的返回值
因为这里 FunY 没有括号,所以返回的是一个(内存里的) ...
谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错 孙赖 发表于 2020-9-10 19:34
谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错
因为如果加上了(),那么funX这个函数的返回值就是5,一个int值怎么能使用()调用呢,所以你的print(a())必然报错 闭包函数,会保存一些内部的变量,比如x = 5,这个变量会被 funY所用。普通函数,运行完成后,没有局部的变量保留。
至于你说的括号问题,就像你可以把函数赋值给一个变量a = func ,然后在用a()去运行这个函数。函数也可以当做一个变量去传递的。有括号表示要运行这个函数 孙赖 发表于 2020-9-10 19:34
谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错
如果在内部加上括号(return FunY()), 那么就不用在外部进行 a() 了
因为 a 就是 FunY() 的返回值 5(a = FunX() 就等于 5)
那么就变成了 5() 因为 int 的实例不是 callable (你可以简单理解为 5 不是一个函数)
就会报错
可以把函数名看做一块代码的地址
funy():
......
return funy
就是把地址返回回来,你再用一个变量(a)去接收它(funy)。然后 a 就等于 funy 了! 现在就可以把 a 看做是一个函数名了! 对于一个函数 func, 加上括号就表示获取它的返回值,这个你清楚吧,然后,因为这里 FunY 没有括号,所以返回的是一个(内存里的)位置,,只要在外部赋值(a = FunX)然后直接加上括号就可以返回 FunY 的值了(a()),再其次,如果如果在内部加上括号(return FunY()), 那么就不用在外部进行 a() 了因为 a 就是 FunY() 的返回值 5(a = FunX() 就等于 5),那么就变成了 5() 因为 int 的实例不是 callable (你可以简单理解为 5 不是一个函数),就会报错。
页:
[1]