目录标题
- 1、函数参数
- 2、闭包
- 3、闭包的使用
- 4、闭包内修改外部变量
1、函数参数
def fun01():
print('func01 is show')
#fun01() 会输出打印结果
print(fun01)#输出:<function ox11....地址>
#函数名存放的是函数所在空间的地址
fun02 = fun01 #函数名也可以像普通变量一样赋值
fun02() #输出:func01 is show
函数名–存放的是函数所在空间的地址
函数名()—执行函数名所存放空间地址中的代码
函数名也可以像普通变量一样赋值,fun02 = fun01
def foo(func):
func()
foo(func01) #输出:func01 is show
2、闭包
调用完函数后,函数内的变量都销毁了,需要保存函数内的变量时----用闭包
闭包定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,把使用外部函数变量的内部函数称为闭包
#嵌套函数,函数里面再定义函数
def func_out(num1):
def func_inner(num2):
num = num1 +num2 #内部函数使用了外部函数的变量num1
print("现在的值:",num)
return func_inner #外部函数返回了内部函数
#创建闭包实例
f = func_out(10)
#执行闭包
f(1) #返回11
f(2) #返回12
其中:f = func_inner,f() =func_inner()
结论:通过f = func_out(10)创建闭包,实际上f()等价于内部函数func_inner()即调用闭包就相当于调用内部函数
结论:闭包可以对外部函数的变量进行保存
3、闭包的使用
需求:根据配置信息使用闭包实现不同人的对话信息
#外部函数
def config_name(name):
#内部函数
def say_info(info):
print(name+":",info)
return say_info
tom = config_name("tom")
tom("你好")
tom("你在吗")
jer = config_name("jerry")
jer("你好")
jer("你在吗")
闭包不仅可以保存外部函数的变量,还可以提高代码的复用性
4、闭包内修改外部变量
def func_out(num1):
def func_inner(num2):
nonlocal num1 #这样定义一下,就可以改变外部的num1了
num1 = num1 +10 #这里的num1是新变量内部变量,不改变外部的num1
print(num1)
func_inner(10)
print(num1)
return func_inner #外部函数返回了内部函数
#创建闭包实例
f = func_out(10)
#执行闭包
f(1) #返回11
如果没有nonlocal num1 这句,则两次打印的值都是10