zoukankan      html  css  js  c++  java
  • python 函数闭包()

    闭包(closure)

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

    example1:

     1 def test(*args):
     2     
     3     def test_1():
     4         rst = 0
     5         for i in args:#这里使用了函数外部的参数
     6             rst += i
     7         return rst
     8     return test_1#将函数作为返回值返回,相关参数和变量保存在返回的函数中
     9 
    10 a = test(1,2,3)
    11 print(a())

     这上面就是一个常见的闭包

    闭包也有坑人的地方

    example2:

    def count():
        fs = []
        #这里定义了一个列表
    
        for i in range(1,4):
            #定义了一个函数f
            #f是一个闭包的结构
            def f():
                return i*i#这里不会马上计算 要返回的时候才会计算
            fs.append(f)
        return fs
    f1,f2,f3 = count()
    print(f1())
    print(f2())
    print(f3())
    # 9
    # 9
    # 9
    # [Finished in 0.2s]
    # 为什么会是999呢,造成上述状况的原因是,返回函数引用了变量i,
    # 而i并不是立即执行,而是等腰三个函数都返回的时候才统一执行
    # 此时i已经变成了3,最终调用的时候 返回的都是 3*3
    # 

    上述问题得到结果: 返回闭包时,不能引用任何循环变量

    解决办法:

    再在外面套一个函数

    example3:

    def count2():
        fs = []
        #这里定义了一个列表
        def f(i):#将i作为参数传入进去
            def g():
                return i*i#这里i返回的时候会马上执行
            return g
    
        for i in range(1,4):
            fs.append(f(i))
        return fs
    f1,f2,f3 = count2()
    print(f1())
    print(f2())
    print(f3())
    #1
    #4
    #9
       生命不息
       希望不止
       将来的你
       一定会感谢现在拼命的自己
       fighting!!!
  • 相关阅读:
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    iOS 屏幕旋转 nav+tabbar+present(网页) 2016
  • 原文地址:https://www.cnblogs.com/lonelyshy/p/9603689.html
Copyright © 2011-2022 走看看