闭包函数

一、什么是闭包?

#内部函数包含对外部作用域而非全局作用域的引用

#提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇

        def counter():
            n=0
            def incr():
                nonlocal n
                x=n
                n+=1
                return x
            return incr

        c=counter()
        print(c())
        print(c())
        print(c())
        print(c.__closure__[0].cell_contents) #查看闭包的元素

 

二、闭包的意义与应用

#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)
    from urllib.request import urlopen

    def index(url):
        def get():
            return urlopen(url).read()
        return get

    baidu=index('http://www.baidu.com')
    print(baidu().decode('utf-8'))

 

三、闭包函数讲解

1.简述

闭包函数=函数嵌套定义+名称空间与作用域+函数对象
闭:指的是该函数是一个定义在函数内部的函数
包:闭函数访问了一个来自于外层函数中的名字
#示例
def f1():
    x = 111
    def f2():
        print('from f2: ',x)

    return f2  # 千万不要加括号

res=f1()

def foo():
    x=222
    res()

foo()

  

2、为函数体传参的解决方案:

2.1直接定义形参

def f2(x):
    print(x)

f2(111)
f2(222)
f2(333)

 

2.2闭包函数是一种为函数体传参的解决方案

def f1(x):
    # x=111
    def f2():
        print(x)

    return f2  # return f1.locals.f2的内存地址

f2=f1(111)
f2()

  

 



posted @ 2020-08-08 16:09  sean_wang  阅读(113)  评论(0编辑  收藏  举报