闭包:
1.函数内的属性是有生命周期的,生命周期都是在函数执行期间
2.内部函数对外部函数作用域里变量的引用
3.闭包内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象
def func1():#外部函数
print('this is func1')
def func2(num):#内部函数
print('this is func2')
func1()
# func2() #创建过程在func1函数的执行过程中,报错:func2未被定义
```python
def func1():#外部函数
print('this is func1')
def func2():#内部函数
print('this is func2')
return func2
func1()
# func2() #创建过程在func1函数的执行过程中
var = func1() #将外部函数的返回值,也就是内部函数存储在一个变量里
var() #调用func2()
def func1():#外部函数
a=1 #外部函数作用域里的变量
print('this is func1')
def func2(num):#内部函数
print('this is func2')
print(num+a)
return func2
func1()
# func2() #创建过程在func1函数的执行过程中
var = func1() #将外部函数的返回值,也就是内部函数存储在一个变量里
var(3) #执行结果为4
#使用闭包实现,将列表中的第一个元素累加1
mylist = [1,2,3,4,5]
def func1(obj):
print('func1:',obj)
def func2():
obj[0]+=1
print('func2',obj)
return func2
var = func1(mylist)
#输出func1:[1,2,3,4,5]
var()
#输出func2:[2,2,3,4,5]
var()
#输出func2:[3,2,3,4,5]
var()#输出func2:[4,2,3,4,5]
装饰器:
1.不影响原有函数的功能,还能添加新的功能,常见,拿到第三方的API,我们需要添加一些功能时需要用到装饰器
d
ef func1(func): #外部闭包函数的参数是被装饰的函数对象
def func2():
func()
#func()函数其实调用的就是myprint()函数
print('aaaaaaaaaabbbbbbbb')
func() #返回了外部函数接收的参数,被装饰函数的调用
return func2
#return func #返回了函数对象
#return func() #返回的是一个函数调用
#func1(myprint)() #接收被装饰的函数作为参数,而且还要继续调用一次
@func1 #装饰器将myprint()函数传入func1()中,然后func2()先打印aaabbb,而后再执行myprint()函数
def myprint():
print('你好,我是print')
myprint()
打印结果:
你好,我是print
aaaaaaaaaabbbbbbbb
你好,我是print
#装饰器示例
def arg_func(sex):
def func1(func_1):
def func2():
func_1()
#调用被装饰函数
if sex == 'man':
print('你需要养家')
elif sex == 'woman':
print('你不需要养家')
else:
print('你需要好好学习')
return func2
return func1
@arg_func(sex='man')
def man():
print('你是男人,')
@arg_func(sex='woman')
def woman():
print('你是女人,')
@arg_func(sex='child')
def child():
print('你是孩子,')
man()
woman()
child()
打印结果:
你是男人,
你需要养家
你是女人,
你不需要养家
你是孩子,
你需要好好学习