Python 高级函数-----闭包

闭包

什么是闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。

需要满足的条件

1、一个函数内嵌套一个函数

2、外部函数的返回值必须是这个内部函数

3、内部函数必须使用外部函数中的局部变量

def fun_1():
    num_1=9
    def fun_2(num_2):
        print(num_1+num_2)
    return fun_2
f=fun_1() #现在f=fun_2
f(8)       #fun_2(8)

输出  17

这时就称fun_2为闭包

由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放

def fun_2():
    a=list()
    def fun(num):
        a.append(num)
        print(num)
        return a
    return fun
g1=fun_2()
g2=g1(2)
print('****',g2)
g3=g1(3)
print('*****',g3)


输出结果
2
**** [2]
3
***** [2, 3]

当执行fun_2函数时,变量a被创建。执行g1(2)时,列表a添加一个值2,当执行g2(3)时,列表a又添加了一个值。我们知道一个函数内的局部变量的生命周期是从执行函数开始到到结束。而现在我们函数已经执行完了,按道理来讲局部变量a应该清除才对。这就是因为闭包的原因,上面也说了闭包使用了外部函数的局部变量,这就导致局部变量a一直在内存中无法释放,占用内存。

为什么使用闭包?

闭包就是为了不懂原函数的代码, 还要给他增加新功能的一个手段,通过外面的一层层函数传递的参数,让最内层函数,直接调用外层函数的代码,增加新的功能。

优点:闭包优化了变量,原来需要类对象完成工作,闭包也可以完成。

缺点:由于闭包引用外部函数的局部变量,则外部函数的局部变量,没有完全释放,占用内存。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值