找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2186|回复: 4

[已解决] Python闭包的问题

1

主题

8

帖子

8

积分

贫民

积分
8
夏鸥 发表于 2019-4-16 22:26:56 | 显示全部楼层 |阅读模式
本帖最后由 夏鸥 于 2019-4-18 15:16 编辑

Python的闭包我理解了 但是有段代码 执行了流程我实在很纳闷 所以求各位帮忙看下
  1. def count():
  2.     fs = []
  3.     for i in range(1, 4):
  4.         def f():
  5.             return i*i
  6.         fs.append( f )
  7.     return fs

  8. f1, f2, f3 = count()
  9. #这段代码我理解的。因为 在执行 f1(),f2(),f3()的时候 找到的i值为 3所以都是9
  10. print('f1的结果是:' ,f1())
  11. print('f2的结果是:' ,f2())
  12. print('f3的结果是:' ,f3())
复制代码
这个代码我是理解了的。
下面的代码就有些难以理解了 百度了一大堆 也没有人说为啥,。就是全部交付代码 什么也不说

  1. def count():
  2.     def f(j):
  3.         
  4.         def g():
  5.             return j*j  #这里的代码被先执行了吗?
  6.         
  7.         return g
  8.     fs = []
  9.     for i in range(1, 4):
  10.         fs.append( f( i ) )
  11.     return fs   #那这里的代码又是返回了 谁呢?

  12. f1, f2, f3 = count()
  13. #这里的我就有点纳闷了。 是因为 f(i) 执行了函数 g()么?
  14. print('f1的结果是:' ,f1())
  15. print('f2的结果是:' ,f2())
  16. print('f3的结果是:' ,f3())
复制代码


回复

使用道具 举报

0

主题

3

帖子

3

积分

贫民

积分
3
Z-zag 发表于 2019-4-18 14:15:41 | 显示全部楼层
本帖最后由 Z-zag 于 2019-4-18 14:17 编辑

如果你真的理解了第一组代码输出都是9的原因,以及必包,那第二组代码很好理解啊。
首先05 行代码没有运行。至于14行的问题,我们从头说
python从上到下预处理你顶层函数,13行开始执行,执行 count() 函数,进入count() 函数继续预处理顶层函数,在08行开始执行,创建一个空列表 fs,迭代第一次,i=1,fs列表添加的元素是一个以 i 为参数的函数 f() ,程序进入函数 f(i) ,预处理 g() 函数,返回调用对象 g,添加到 fs 列表中,完成一次迭代。继续执行第二次第三次迭代。返回 fs 列表,之后将列表 fs 内的元素拆包给三个变量 f1, f2, f3,然后继续向下执行,15行 print()函数,执行f1() 。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

8

积分

贫民

积分
8
夏鸥  楼主| 发表于 2019-4-18 14:51:24 | 显示全部楼层
Z-zag 发表于 2019-4-18 14:15
如果你真的理解了第一组代码输出都是9的原因,以及必包,那第二组代码很好理解啊。
首先05 行代码没有运行 ...

也就是说,f(i) 是执行函数 f() 带入参数i 这时候的 参数i其实也作为g 函数的闭包变量i.  g函数并未执行,所以每次迭代每次都会生产不同的参数/变量i的值。 在 15~17行代码 运行 f1,f2,f3 其实就是在运行 g的三个不同变量的函数。对么?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

3

积分

贫民

积分
3
Z-zag 发表于 2019-4-18 15:09:11 | 显示全部楼层
本帖最后由 Z-zag 于 2019-4-18 15:14 编辑
夏鸥 发表于 2019-4-18 14:51
也就是说,f(i) 是执行函数 f() 带入参数i 这时候的 参数i其实也作为g 函数的闭包变量i.  g函数并未执行 ...

是的,这段代码其实就是用来理解必包的。 但是 g()不需要参数。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

8

积分

贫民

积分
8
夏鸥  楼主| 发表于 2019-4-18 15:15:41 | 显示全部楼层
Z-zag 发表于 2019-4-18 15:09
是的,这段代码其实就是用来理解必包的。 但是 g()不需要参数的.

好的多谢指点了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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