鱼C论坛

 找回密码
 立即注册
查看: 1900|回复: 7

[已解决]写小甲鱼的作业又碰到了一个关于闭包小问题

[复制链接]
发表于 2020-9-10 18:59:10 | 显示全部楼层 |阅读模式

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

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

x
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就不用加括号了呀,这个闭包和普通的内嵌函数到底有什么区别呀,新手小白搞不明白
最佳答案
2020-9-10 19:04:13
对于一个函数 func, 加上括号就表示获取它的返回值
因为这里 FunY 没有括号,所以返回的是一个(内存里的)位置,
只要在外部赋值(a = FunX)然后直接加上括号就可以返回 FunY 的值了(a())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-10 19:04:13 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
对于一个函数 func, 加上括号就表示获取它的返回值
因为这里 FunY 没有括号,所以返回的是一个(内存里的)位置,
只要在外部赋值(a = FunX)然后直接加上括号就可以返回 FunY 的值了(a())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

因为如果加上了(),那么funX这个函数的返回值就是5,一个int值怎么能使用()调用呢,所以你的print(a())必然报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-10 21:42:06 | 显示全部楼层
闭包函数,会保存一些内部的变量,比如x = 5,这个变量会被 funY所用。普通函数,运行完成后,没有局部的变量保留。

至于你说的括号问题,就像你可以把函数赋值给一个变量  a = func ,然后在用a()去运行这个函数。函数也可以当做一个变量去传递的。有括号表示要运行这个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-11 12:26:40 From FishC Mobile | 显示全部楼层
孙赖 发表于 2020-9-10 19:34
谢谢了 但是还是有一点一知半解,为什么我将return funy后面加上括号后再运行就会报错

如果在内部加上括号(return FunY()), 那么就不用在外部进行 a() 了
因为 a 就是 FunY() 的返回值 5(a = FunX() 就等于 5)
那么就变成了 5() 因为 int 的实例不是 callable (你可以简单理解为 5 不是一个函数)
就会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-11 15:41:49 | 显示全部楼层

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


return funy

就是把地址返回回来,你再用一个变量(a)去接收它(funy)。然后 a 就等于 funy 了! 现在就可以把 a 看做是一个函数名了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 不是一个函数),就会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 00:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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