1.11.3闭包
# 闭包
# 在函数中提出的概念:
''':cvar
条件:
1. 外部函数中定义了内部函数
2. 外部函数是有返回值
3. 返回的值:内部函数名
4. 内部函数引用了外部函数的变量
格式:
def 外部函数():
...
def 内部函数():
...
return 内部函数
'''
def func():
a = 100
def inner_func():
b = 99
print(a, b)
return inner_func
# print(a)
# inner_func()
x = func()
print(x)
# x就是内部函数,x()就是调用函数
x()
# 闭包
def func(a, b):
c = 10
def inner_func():
s = a + b + c
print("sum是:", s)
return inner_func()
# 调用func
ifunc = func(6, 9) # ifunc就是inner_func ifunc=inner_func
# 调用返出来的内部函数
ifunc()
# 闭包
''':cvar
保存返回闭包时的状态(外层函数变量)
闭包有什么缺点呢?
闭包的缺点1. 作用域没有那么直观
闭包缺点2. 因为变量不会被垃圾回收所以有一定内存占用问题
闭包作用:1.可以使用同级的作用域
闭包作用:2.读取其他元素的内部变量
闭包作用:3.延长作用域
闭包总结:
1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成
2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
3.闭包的好处,使代码变得简洁,便于阅读代码
4.闭包时理解装饰器的基础
'''
def func(a, b):
c = 10
def inner_func():
s = a + b + c
print("sum是:", s)
return inner_func
# 调用func
ifunc = func(6, 9) # ifunc就是inner_func ifunc=inner_func
ifunc1 = func(2, 8)
# 调用返出来的内部函数
print(ifunc)
print(ifunc1)
ifunc()
ifunc1()
# 闭包的应用
def func():
a = 100
def inner_func1():
b = 90
s = a + b
print(s)
def inner_func2(): # define
inner_func1()
print('------>inner_func2', a)
return 'hello'
return inner_func2 # <function func.<locals>.inner_func2 at 0x000001A0B2857430>
# 调用func
f = func()
print(f)
ff = f() # inner_func()
print(ff) # hello
# 计数器
def generate_count():
container = [0]
def add_one():
container[0] = container[0] + 1 # [1]
print('当前时第{}次访问'.format(container[0]))
return add_one
# 内部函数就是一个计数器
counter = generate_count()
counter() # 第一次的访问
counter() # 第二次的访问
counter() # 第三次的访问
|