4.闭包

作者: 软件开发技术修炼 | 来源:发表于2022-04-02 14:23 被阅读0次

    一、函数也是对象,和变量一样

    可以作为参数被传递
    可以在函数内部定义
    可以作为函数返回值
    函数可以赋值给变量

    二、内部函数

    把函数的内部定义函数,就是内部函数

    def outter():
        print('我是外部函数')
    def inner():
        print('我是outter的内部函数')
        print('调用内部函数')
        inner()
        print('我再次调用内部函数,自己家的想用就用,随时用')
        inner()
        print('还可以返回给大家共用')
        return inner
    #调用外部函数,并接受返回值
    func = outter()
    #调用outter返回的内部函数
    print('在外部调用内部函数')
    

    三、闭包

    内部函数特性:

    1、可以访问它所属的外部函数的局部变量,这些变量被称为nonlocal,或者enclosing变量
    2、可以携带这些nonlocal变量,让它们不会被回收
    所以说Python中的闭包就是内部函数,准确点是使用了nonlocal变量的内部函数。

    闭包函数必须满足:

    1、函数内部定义的函数
    2、包含对外部作用域而非全局作用域的引用

    1. 没有引用变量

    def outer():
        def inner():
            print("inner func excuted")
        inner()
        print("outer func excuted")
    outer()
    
    #结果:
    inner func excuted
    outer func excuted
    

    2. 变量x属于全局变量,而非外部作用于域的变量

    x= 1
    def outer():
        def inner():
            print("x = %s" %x)  # 变量x属于全局变量,而非外部作用于域的变量
            print("inner func excuted")
        inner()
        print("outer func excuted")
    
    outer()
    #结果:
    x=1
    inner func excuted
    outer func excuted
    

    3. 正真的闭包

    def outer():
        x = 1
        def inner():
            print("x = %s" %x)  # 变量x属于外部作用于域的变量
            print("inner func excuted")
        inner()
        print("outer func excuted")
    
    outer()
    结果:
    x = 1
    inner func excuted
    outer func excuted
    

    4. 输出引用的外部局部变量

    结果表明,在inner内部,引用了两个外部局部变量。如果引用的是非局部变量,那么这里输出的为None

    
    def outer():
        x = 1
        y = 2
        def inner():
            print("x=%s" %x)
            print("y=%s" % y)
            # print("inner func excuted")
        # inner()
        # print("outer func excuted")
        print(inner.__closure__)
        return inner
    outer()
    
    #输出:
    (<cell at 0x02AE22D0: int object at 0x65A4D430>, <cell at 0x02B68070: int object at 0x65A4D440>)
    

    5. 闭包实际应用

    from urllib.request import urlopen
    
    def index(url):
        def get():
            # 只要在函数内部的变量都属于函数。那么我在index(url),这个url也属于函数内部
            return urlopen(url).read()
        return get
    
    python = index("http://www.python.org")
    print(python)
    baidu = index("http://www.baidu.com")
    print(baidu)
    
    #结果:
    <function index.<locals>.get at 0x02B4EA98>
    <function index.<locals>.get at 0x02B4EC00>
    

    关于闭包,还有哪些实际应用,欢迎下方补充~

    相关文章

      网友评论

          本文标题:4.闭包

          本文链接:https://www.haomeiwen.com/subject/poltsrtx.html