# 闭包本质是一个函数,如意一个内部函数引用了外部作用域中的变量,那么这个函数就被认为是闭包。
# 闭包的作用:使局部变量被外在函数外被访问成为了可能
# 这里我在函数外想访问in_func会报错
def func():
in_func = 'In Func'
print(in_func)
# print(in_func)
# 那通常我们是定义全部变量
# 函数可以引用外部的全局变量
out_func = 'Out Func'
def func():
print(out_func)
func()
# 闭包的话就是不用使用全局变量,外部也能访问到。
def closure_func(): # closure_func函数返回f函数
in_func = 'In Func'
# f函数返回in_fuc变量
def f():
return in_func
return f
# 跟上面是对应的,closure_func返回的是一个方法,方法里使我们想要的局部变量
# <function closure_func.<locals>.f at 0x0000027F84C6BBF8>
print(closure_func())
# 获得局部变量
print(closure_func().__closure__[0].cell_contents)
# In Func
print(closure_func()())
# 写一个带有参数的函数
def add_number(x):
def number(y):
return x + y
return number
add_number5 = add_number(5)
# number:15
print(f'number{add_number5(10)}')
# number:105
print(f'number:{add_number5(100)}')
# 注意的地方:
# 修改外部作用域中的局部变量,使用nonlocal 关键字
def f():
m = 1
def g():
# 指明为上一个作用域中的变量
nonlocal m
m = 10
return m
return g
print(f()())
first = []
# 输出:4,4,4
# 原因:循环执行完后,i变成2后才赋值给函数
for i in range(3):
def loop():
return i * 2
first.append(loop)
for f in first:
print(f())
first = []
# 0,2,4
# 循环向内部函数传入参数
def loop():
def f(x):
return x * 2
for x in range(3):
first.append(f(x))
return first
print(loop())
参考文章
python闭包
python闭包
一步一步教你认识Python闭包
深入浅出python闭包
网友评论