嵌套函数
1.外部函数内:定义内部函数并调用内部函数
2.作用域:内部函数不可以直接调用
def outfunc():
def infunc(): # 定义内部函数
pass
infunc() # 调用内部函数
outfunc()
闭包
1.外层函数结束后将被内层函数用到的外出函数变量不会释放,会被内层函数使用
2.外层函数的返回值是内层函数的引用
3.返回值的type类型为dunction类型,说明返回值是一个函数,根据内部函数需不需要传参调用返回值
def outfunc( a ):
b = 10
def infunc(c):
print(a+b) # 内层函数用到外层函数变量
print(c)
return infunc # 外层函数的返回值是内层函数的引用,注意不是调用,装饰器不是引用是调用,返回值的type类型为dunction类型
if __name__ == '__main__':
# 在这里我们调用外函数传入参数5
# 此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
demo1 = outfunc(5) # 返回值inner赋值给demo,为function类型
print(type(demo)) # 返回值的type类型为dunction类型说明返回值是一个函数,调用函数给形参c传参
demo1(1) # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
demo2 = outfunc(7)
demo2(2)
调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
执行结果:
装饰器
import functools
def outfunc(func):
print(type(func))
print(11111111111111111111)
# @functools.wraps(func)
def infunc():
print(2222222222222222222222)
func() # return表示装饰器有返回值
return infunc
@outfunc
def func():
print('111111')
# func()
func()
func()
print(func.__name__)
import functools
def outfunc(func):
print(type(func))
print(11111111111111111111)
@functools.wraps(func)
def infunc():
print(2222222222222222222222)
func() # return表示装饰器有返回值
return infunc
@outfunc
def func():
print('111111')
# func()
func()
func()
print(func.__name__)
def outfunc(func):
print(type(func))
# @functools.wraps(func)
def infunc():
print(2222222222222222222222)
return func() # return表示被装饰函数有返回值
return infunc
@outfunc
def func():
print('111111111111111111111111')
return '333333333333333333333333333'
# func()
print(func())
print(func())
print(func.__name__)