Python闭包

闭包
    如果希望其中的一个变量不被回收,能够一直存在程序中,我们可以使用闭包来实现,即在外层函数中声明并返回里层函数
    里层函数中可以声明一个局部变量,这样局部变量并不会被回收掉, 因为当我们调用外层函数的时候,里层函数会被调用,但是外层函数被回收的时候,里层函数还没有执行结束,所以程序是不会强制回收的

特点:

1、外部函数中定义了内部函数
2、外部函数是有返回值的
3、返回的值是:内部函数名
4、内部函数引用了外部函数的变量

格式
def 外部函数():
    ...
    def 内部函数():
        ...
    return 内部函数

闭包的缺点
1. 作用域没有那么直观
2. 因为变量不会被来及回收,所以有一定的内存占用问题。

闭包的作用
1. 可以使用同级的作用域
2. 读取其他元素的内部变量
3. 延长作用域

闭包总结
1. 闭包看似优化了变量,原来需要类对象完成的工作,闭包也可以完成
2. 由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
3. 闭包的好处,使代码变的整洁,便于阅读代码
4. 闭包是理解装饰器的基础

闭包练习

打印 a、b的值

def func():
    a = 100
    def inner_func():
        b = 99
        print(a, b)
    return inner_func
# 调用
x = func()
print(x)
x()
<function func.<locals>.inner_func at 0x00000234ADFB49D8>
100 99

求和

def func(a, b):
    c = 10
    def inner_func():
        s = a + b + c
        print("相加之后的和是:", s)
    return inner_func

# 调用外部函数
ifunc = func(6, 9)
ifunc1 = func(2, 8)
ifunc()
ifunc1()
相加之后的和是: 25
相加之后的和是: 20
def func():
    a = 100

    def inner_func1():
        b = 90
        s = a + b
        print(s)

    def inner_func2():
        inner_func1()       # 调用func1
        print("我在 inner_func2 里面")
        return 'hello'

    return inner_func2

x = func()
print(x)
x()
xx = x()
print(xx)
<function func.<locals>.inner_func2 at 0x0000017D618F4950>
190
我在 inner_func2 里面
190
我在 inner_func2 里面
hello

访问次数

def Count():
    container = 0

    def add_one():
        nonlocal container
        container = container + 1
        print('当前是第{}次访问'.format(container))

    return add_one

counter = Count()
counter()
counter()
counter()
当前是第1次访问
当前是第2次访问
当前是第3次访问
Last modification:August 10th, 2020 at 05:18 pm
如果觉得我的文章对你有用,请随意赞赏