Python基础 - 闭包

目录

什么是闭包

闭包满足的条件

闭包的作用

闭包的使用


什么是闭包

定义:闭包就是能够读取外部函数内的变量的函数

定义一个函数A , 函数A中嵌套了另一个函数B,并且A将函数B进行返回,这里的函数B就叫做闭包

例如下面的代码,outer函数中有一个inner函数,inner函数可以获取到outer函数中的变量,outer函数将inner函数进行返回,F=outer() 将获取到inner函数对象,F此时保存的是innner函数所在位置的引用,F()相当于执行inner函数

inner函数就形成了闭包,外部函数返回的不是一个具体的值,而是一个函数。可以将返回的函数赋值给一个变量,这个变量可以在后面被继续执行调用

注:outer 内部的所有局部变量,对inner都是可见的,但是infunc内部的局部变量,对outfunc 是不可见的

def outer():
    x = 1
    def inner():
        print(x)
    return inner

F = outer()  #获取了inner函数对象
F()    #执行inner函数

闭包满足的条件

1.必须有一个内嵌函数

2.内嵌函数必须引用外部函数中的变量

3.外部函数的返回值必须是内嵌函数

闭包的作用

作用1:闭包将外层函数内的局部变量和外层函数的外部连接起来。

作用2:将外层函数的变量持久地保存在内存中

一般来说,函数内部的局部变量在这个函数运行完以后,就会被Python的垃圾回收机制从内存中清除掉,但下面代码中,outer是inner的父函数,F=outer()将inner赋值给了全局变量F,因此inner始终会在内存中,inner依赖outer,因此outer也会一直在内存中,不会被回收掉

def outer():
    x = 1
    def inner():
        print(x)
    return inner

F = outer()  #获取了inner函数对象
F()    #执行inner函数

注:由于闭包会使得函数中的变量都被保存在内存中,会增加内存消耗,滥用闭包会造成程序的性能问题,可能导致内存泄露 

闭包的使用

实例1:函数每次传入一个数字,对数字进行累加操作

这里需要在函数内部对函数外部的变量sum进行操作,可以通过global声明全局变量来实现,但因为全局变量在其他地方也都可以访问到,不推荐使用

sum = 0
def get_sum(num):
    global sum
    sum += num
    return sum

print(get_sum(1))  # 输出:1
print(get_sum(2))  # 输出:3
print(get_sum(3))  # 输出:6
print(sum)  # 输出:6

另一个方式就是通过闭包来实现

nonlocal声明sum为外层函数的变量

sum = 0
def get_sum(sum):
    def add_num(num):
        nonlocal sum
        sum += num
        return sum
    return add_num

add = get_sum(sum)
print(add(1))  # 输出:1
print(add(2))  # 输出:3
print(add(3))  # 输出:6
print(sum)  # 输出:0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值