大前提
闭包函数 = 名称空间与作用域 + 函数嵌套 + 函数对象
核心点:名字的查找关系是以函数定义阶段为准
什么是闭包函数
"闭"函数指的该函数是内嵌函数
"包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)
闭包函数
名称空间与作用域的应用+函数嵌套
def f1():
x = 33333333333333333333
def f2():
print(x)
f2()
x=11111
def bar():
x=444444
f1()
def foo():
x=2222
bar()
foo()
输出:33333333333333333333
思路:调用的是函数foo(),函数foo()内的x=2222未被调用,调用了函数bar()
函数bar()内的x=444444未被调用,调用了函数f1()
函数f1()内定义了x,定义了函数f2(),函数f2()内输出x
函数f2()内未定义x,就去f1()中,找到了x=33333333333333333333
最后函数f1()调用了函数f2(),输出33333333333333333333
def f1():
x = 33333333333333333333
def f2():
print('函数f2:',x)
return f2
f=f1() # 调用f1(),返回函数f2(),输出:函数f2:33333333333333333333
def foo():
x=5555
f()
foo() # 调用foo(),foo()内调用了f(),也就是调用了f2,输出:函数f2:33333333333333333333
输出:函数f2: 33333333333333333333
为何要有闭包函数
两种为函数体传参的方式:
方式一:直接把函数体需要的参数定义成形参
def f2(x):
print(x)
f2(1)
f2(2)
f2(3)
输出:
1
2
3
方式二:使用闭包函数
def f1(x): # x=3
# x=3
def f2():
print(x)
return f2
x=f1(3)
print(x)
x()
输出:
<function f1.<locals>.f2 at 0x02F734A8>
3