zoukankan      html  css  js  c++  java
  • Python连载18-closure闭包解释及其注意点

    一、闭包

    1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包。

    2.例子:连载17中的myF4就是一个典型的例子​。

    3.闭包常见的坑

     
    
    def count():
    
        #定义列表
    
        fs = []
    
        for i in range(1,4):
    
            def f():
    
                return i*i
    
            fs.append(f)
    
            #按照我们的预期,应该是fs=[f,f,f].其中f中一次包含1,4,9,这样才对,但实际结果不是,我么接着看
    
        return fs
    
    f1,f2,f3 = count()
    
    print(f1(),f2(),f3())

    不是我们预期的1 4 9。

    (1)原因分析:返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才统一执行,此时i已经变为3,最终调用的时候却反回了3*3.

    (2)总结:返回闭包的时候,返回函数不能引用任何循环变量了

    (3)解决方案:再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不变。

    ​改进代码:

    def count2():
    
        def f(j):
    
            def g():
    
                return j*j
    
            return g
    
        fs = []
    
        for i in range(1,4):
    
            fs.append(f(i))
    
            #我们进行了传参,因此j就固定下来,它就执行了j
    
        return fs
    
    f4,f5,f6 = count2()
    
    print(f4(),f5(),f6())

    二、装饰器

    def hello():
    
        print("我是一个程序")
    
    f = hello
    
    f()
    
    hello()
    
    #用id来证明f和hello是一个函数
    
    print(id(f),id(hello))

    三、源码:

    d20_2_closure_interpretation

    地址:https://github.com/ruigege66/Python_learning/blob/master/d20_2_closure_interpretation

    2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

    3.博客园:https://www.cnblogs.com/ruigege0000/

    4.欢迎关注微信公众号:傅里叶变换,后台回复”礼包“,获取大数据学习资料。

  • 相关阅读:
    am335x gpio控制
    递归删除子目录下所有.la后缀文件
    linphone 在am335x的编译过程
    linphone 调试信息
    【POJ 3020】Antenna Placement(二分图匹配)
    【POJ 1062】昂贵的聘礼(最短路)
    【POJ 2485】Highways(Prim最小生成树)
    【Gym 100947E】Qwerty78 Trip(组合数取模/费马小定理)
    解决already defined in .obj 的问题(定义/声明的区别)
    C语言+SDL2 图形化编程
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/11108385.html
Copyright © 2011-2022 走看看