1.闭包
(1)条件:
- 外部函数中定义了一个内部函数
- 外部函数有返回值
- 返回的值是内部函数名
- 内部函数引用了外部函数变量
(2)格式:
def 外部函数名():
...
def 内部函数名():
...
return 内部函数名
def func():
a = 100
def inner_func():
b = 99
print(a,b)
return inner_func
x = func()
print(x)
# x就是内部函数,x()就是调用内部函数
x() # 100,99
def func(a,b):
c = 10
def inner_func():
s = a + b + c
print('相加之后的结果是:',s)
return inner_func
# 调用func
ifunc = func(6,9)
# 调用返出来的内部函数
ifunc() # 25
2.闭包的应用
(1) 能够保存并返回闭包时的状态(外层函数变量)
# 计数器
def generate_count():
container = [0]
def add_one():
container[0] = container[0] + 1
print('当前第{}次访问'.format(container[0]))
return add_one
counter = generate_count()
counter() # 当前第1次访问
counter() # 当前第2次访问
counter() # 当前第3次访问
3.闭包缺点
(1)作用域没有那么直观
(2)变量不会回收,占有一定内存
4.闭包作用
(1)可使用同级的作用域
(2)读取其它元素的内部元素
(3)延长作用域
def func():
a = 100
def inner_func1():
b = 90
s = a + b
print(s)
def inner_func2():
inner_func1()
return 'hello'
return inner_func2
# 调用func
f = func()
f() # 190,其实调用inner_func2()
ff = f()
print(ff) # 190 hello