一:函数闭包的大前提
闭包函数 = 名称空间与作用域 + 函数嵌套 + 函数对象
核心点:名字的查找关系是以函数定义阶段为准
二:什么是闭包函数
"闭"函数指的该函数是内嵌函数
"包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)
闭包函数:名称空间与作用域的应用+函数嵌套
示范:
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