为了账号安全,请及时绑定邮箱和手机立即绑定

函数编程闭包的理解

闭包对初学者还是比较抽象的,其实抛开传统函数的概念当作一种结构实体比较容易理解。

先给出概念

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。

这个从字面上很难理解,特别对于一直使用命令式语言进行编程的程序员们。

下文将结合实例代码进行解释。


正在回答

4 回答

再来看如果我们输出

print "count()", count()

会是什么结果呢 有兴趣的自己看看 它会把中间写过的注释也输出 结构很清晰

结果是 [, , ]

也就是说外部函数F(1)是没有做任何计算的 

只是负责 传入 变量进入闭包 并且 传递出闭包里面的运算结果

 fs 的初始值是 fs = [] 输出值是 [, , ] 是因为它传递了三次F(3)的结果的原因 

这样我们就可以在外部直接调用闭包的结果 f1(), f2(), f3()


1 回复 有任何疑惑可以回复我~
===> F(1) for i in range(1, 4) 传变量或参数入F(2)
===> F(2) i= 1 2 3 传变量或参数入F(3)
===> F(3)  计算并 把计算的F(3)的结果和类型 返回 F(2) //这就是返回3个数值而不是一个list的原因 因为F(3)返回值不是一个list
===> F(2)=F(3) 1 4 9  记录结果并传递结果到外面一层
===> F(1)= f(2)1 4 9 记录的结果是F(3)传递来的 

F(1)->F(2)->传入变量->F(3)运算-> 传递结果->F(2)->F(1)

F(1) 负责的是输入外部引用环境和函数组合

F(2)F(3)闭包 可以引用外部的环境和函数组合,并直接传出结果

我们看到外部的函数没有参与计算 只负责传入变量 并且传递出结果 。
闭包应该视作一种代码结构 而不是当作函数 这样就容易理解了


1 回复 有任何疑惑可以回复我~
#1

慕田峪4803861

更難明
2015-06-22 回复 有任何疑惑可以回复我~
def count():
    fs = []
    for i in range(1, 4):
        print 'star_zero i=',i
        def f(j):
            def g():  
                print "three" ,"i=",i,'g()=',(j*j)             
                return j*j
            print  "two","i=",i, 'g=' ,j*j
            return g
        r = f(i)
        fs.append(r)        
    print  "one","i=",i,"f(i)=", f(i)  
    return fs
f1, f2, f3 = count()
print "out", f1()
print "out", f2()
print "out", f3()
#print "out0", f1(), f2(), f3()
#print "def_count()",  def count()

复制黏贴 仔细看输出基本上就没疑惑了

2 回复 有任何疑惑可以回复我~

先上图和代码 感兴趣的同学自己可以复制代码看看输出

http://img1.sycdn.imooc.com//552bb705000165e307300579.jpg


2 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

函数编程闭包的理解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信