Python 闭包函数

闭包函数

  • 互相嵌套的两个函数叫做闭包,内函数就是闭包函数

    1. 内函数使用了外函数的局部变量
    2. 外函数把内函数返回出来的过程
  • 基本语法

    def zhangyutai_family():
    	father = "马云"
    	def say():
    		print("以后,不准叫我首富,我是韭菜,我已躺平,这是我的爸爸{}说的".format(father))
    	return say
    
    func1 = zhangyutai_family()
    print(func1 , type(func1))
    # 调用函数
    func1()
    
  • 闭包的特点

    延长局部变量的生命周期,生命周期和全局变量一样长,直到代码全部执行结束之后,在释放变量
  • 原因:
    正常来说,局部变量调用时开辟空间,调用结束后,释放空间,所以显得局部变量生命周期较短,但是闭包函数会刻意延长局部变量的生命周期
    def outer(num):
    	def inner(val):
    		return num + val
    	return inne
    num 是局部变量 ,作用范围在outer的内部
    val 是局部变量 ,作用范围在inner的内部
    正常来说,在调用函数时,创建这些局部变量
    在调用结束后,释放这些局部变量
    但是由于所写的是闭包函数,会延长局部变量的生命周期
    func = outer(5)
    res = func(4)
    print(res)
    
  • 解析过程:
    func = outer(5)  num 接受参数 5
    由于内函数使用了外函数的局部变量num ,自己又是闭包,所以刻意延长num这个局部变量的生命周期,不被内存释放.该变量和内函数绑定在一起了.
    
    res = func(4)  val 接受参数 4
    return num + val => return 5 + 4 => 9
    res = 9
    
  • 判定是否是闭包的方法(了解)
    • 获取闭包函数使用的变量 closure , cell_contents (了解)
    • 能够获取到单元格对象就是闭包函数,反之得到None就不是闭包函数
    • 获取单元格对象,封装在元组中 res = func1.closure
    • 如果获取的闭包函数中有延长的局部变量,就是闭包函数,如果返回None,就不是闭包函数
      print(res) # ( <cell at 0x000000000223A558: int object at 0x000000005B7280F0> 对象 , ) 元组
    • 获取元组当中的,cell对象 cell = res[0] print(cell)
    • 获取对象中的被延长的局部变量 print(cell.cell_contents) # 马云
    def foo(z):
        x = 100
        y = 200
        def inner():
            print(z)
            print("inner")
        return inner
    
    func = foo(300)
    func()
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值