鱼C论坛

 找回密码
 立即注册
查看: 833|回复: 6

函数闭包问题

[复制链接]
发表于 2019-6-6 09:40:58 | 显示全部楼层 |阅读模式

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

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

x
def fun1(x):
     def fun2(y):
          return x*y
     return fun2
我想问一下,我看见有得是return fun2   但是有时候有得例子是返回return fun2()  这两种有什么区别  ,在什么情况下,分别怎么使用呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-6 09:44:02 | 显示全部楼层
是不是因为在函数没有参数的时候就是返回return fun2()   有参数就是返回return fun2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 09:47:34 | 显示全部楼层
自己做一些小测试就可以了

def fun1(x):
     def fun2(y):
          return x*y
     return fun2(5)  #如果这里只是return fun2  毫无疑问只能是返回一个地址

print(fun1(5))


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

使用道具 举报

发表于 2019-6-6 10:37:50 | 显示全部楼层
打个比方:一个处长(主程序)要科长(fun1)做一件事,科长把一部分工作交给科员(fun2)做,完成后交给科长,再由科长交给处长,这就是普通的函数嵌套。
如果一个处长(主程序)要科长(fun1)做一件事,科长把自己的任务完成了,并告诉处长其中一部分工作已经下派给科员做,但科员什么时候做,直接由处长决定,而不是科长决定,这就是闭包。
再说说用途,最常见的是在装饰器里,对于初学者理解起来可能比较复杂,用个简单的例子说一下:
编写一个游戏,其中有个血槽的值,可以在fun1中先赋值100,而fun2则是被攻击时调用,每次减少1,并判断是否到达0。你也可以说将血槽给个全局变量,但程序大了,很容易在其它地方被无意修改了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-6-6 10:53:19 | 显示全部楼层
冬雪雪冬 发表于 2019-6-6 10:37
打个比方:一个处长(主程序)要科长(fun1)做一件事,科长把一部分工作交给科员(fun2)做,完成后交给科 ...

哦原来还可以这样用  这就和c里得函数指针 差不多了

  1. def fun1(x):
  2.      def fun2(y):
  3.           return x*y
  4.      return fun2

  5. foo=fun1(67)
  6. print(foo(55))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 13:46:52 | 显示全部楼层
OK   懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 04:47:09 | 显示全部楼层
冬雪雪冬 发表于 2019-6-6 10:37
打个比方:一个处长(主程序)要科长(fun1)做一件事,科长把一部分工作交给科员(fun2)做,完成后交给科 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 17:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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