什么是闭包?

不喜欢多做文字解释,看代码,能懂就懂,学会百度是必备技能之一
  • 函数的嵌套

  • 内部函数引用外部函数变量 内部函数必须引用一个定义在闭合范围内的变量

  • 必须返回那个内部函数 外部函数必须返回内部函数的引用

  • 保存内部函数的变量

形成闭包之后,闭包函数会获得一个非空的__closure__ 属性,这个属性非常的特别,它可以保存函数内部的变量,不会被外部修改,从而保证了数据的安全性


def fun():
    x = 5
    def interior():
        nonlocal x
        x += 1
        return x
    return interior


a = fun_out()

a()  # 调用a

这是一个简单的闭包,怎么才能通过程序来知道它和普通的函数有什么区别呢


可以通过使用Python内建的 __closure__ 方法来测试

a.__closure__
 (<cell at 0x000001B6333AAFA8: int object at 0x00000000516461E0>,)

如果是一个普通函数呢

In [39]: def a():
    ...:     print("1")

In [40]: a
Out[40]: <function __main__.a>

In [41]: a()
1

In [42]: a.__closure__

In [43]: type(a.__closure__)
Out[43]: NoneType  # 这是一个空类型


闭包可以确保变量安全性


普通函数的写法

_list = []

for i in range(3):
	def func(a):
		return i + a
	
	_list.append(func)
	
for f in _list:
	print(f(1))
	
# 这是一个普通函数,执行结果是3,3,3

原因在于:Python中循环体内定义函数,在循环执行过程当中无法保存不停改变的变量


接下来我们用闭包来实现一下看一下结果

_list = []  # 定义一个list

for i in range(3):
     def func_out(a):
         def func_in(z):
             return a + z
         return func_in
     _list.append(func_out(i))  # for循环持续往列表中添加并且调用func_out
     
for f in _list:
	print(f(1))  # for循环持续往列表中添加并且调用func_in



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值