(1)函数的嵌套
(1)首先明白三点:调用函数意思就是:调用函数所得到的结果是什么。 函数没有被调用,则函数里面代码永远不会被执行。 调用函数只有拿到返回值才有结果
deffunc():defsu():print("shuai")
func()#输出:啥都没有因为su()没有被调用
deffunc():defsu():print("shuai")
su()
func()#输出:shaui
none
因位执行到su()打印出shuai就结束了,函数func()没有拿到返回值。
deffunc():defsu():print("shuai")returnshuai
su()
func()#输出:shuai
shuai
因位执行到su()打印出shuai就结束了,函数func()也拿到返回值。
(2)函数的多层嵌套
definner ():
a=1
definner1():
b=2
print(a)print("inner")definner2():print(a)
inner2()
inner()
总结:(1)全局变量不能用局部变量,局部变量看可以用全局变量,但是不可对全局变量中的不可变数据类型进行修改(即对其加减乘除),如果想要修改用gloabl(),它声明的是去全局变量。
(2)同理,内部函数可以用外函数中的变量,但是不可对其修改,如想修改用nonlocal(),它声明的是距离它最近的上一层函数中的局部变量。
definner ():
a=1
definner1():
b=2nonlocal a #声名a
a+=1
print(a)print("inner")definner2():print(a)
inner2()
inner()
(3)函数的本质
函数之所以能被调用,比如func()就可以调用函数,是因为:func()=func+()=函数名地址+()=调用
(1)函数名字是可以被赋值的
(2)函数名字可以作为容器类型的元素
(3)函数名字可以作为函数的参数
(4)函数名字可以作为函数的返回值
举列子针对(4)
deffunc():print(123)defwawa(f):
f()returnf
xing=wawa(func)
xing()#输出:123
123
函数的闭包
(1)闭包:嵌套函数,且内部函数调用了外部函数的变量
defouter():
a=1
definner():print(a)print(inner.__closure__) #inner.__closure__:用来打印看函数是否为闭包函数
outer()
(2)闭包函数的调用
一般来说我们调用闭包函数,是直接调用闭包函数,而不必通过调用总的函数。
defouter():
a=1
definner():print(a)returninner
inn=outer()
inn()#通过方返回闭包函数的函数名