day12——闭包,装饰器,迭代器
1,函数名的应用(第一类对象)
函数名就是变量名,函数名的命名规范和变量一样
直接打印函数名不加括号就是打印函数的内存地址
函数名可以作为参数传递给参数
闭包:
内层函数中访问外层函数的变量
作用:
1,保护自己的变量不受侵害,变量不对外开放
2,可以让一个变量常驻内存
写法:
def outer():
a = 10
def inner():
print(a)
return inner
查看函数是否是闭包:
__closure__ 打印出来是None就不是闭包,打印出来东西了就是闭包
装饰器
# import time # def func1():#6,执行func1函数 # print('in func1')#7,打印这里 # def timer(func):#2,执行timer函数 func== func1 # def inner():#5执行inner函数 # start = time.time() # func() #5,看第二步,func() == func1(),调用func1 # print(time.time() - start) #8,继续执行这里,游戏结束 # return inner#3,返回inner给调用者 # # func1 = timer(func1)#1,调用timer()函数,func1传给func # func1()#4,接收返回的inner func1() == inner() 调用inner
语法糖
# import time # def timer(func):# 2执行timer函数 func== func1 # def inner(): # 5,执行inner函数 # start = time.time() # func() #6,func()==func1()调用func1 # print(time.time() - start)#9,打印 # return inner#3,返回inner---func1 == inner # # @timer #1,func1 = timer(func1)调用timer函数,传参 # def func1():#7,执行func1函数 # print('in func1') ##--8 打印 # # func1() # 4,func1()==inner()调用inner函数
带参数的装饰器
# import time # def timer(func): # 2,func = func1 # def inner(a):# 5,inner(1) # start = time.time() # func(a)#6,func(1)== func1(1)调用func1函数 # print(time.time()-start)# 8,打印这里 # return inner #3,返回inner func1 = inner # # @timer # 1,func1 == timer(func1) # def func1(a): # print(a)#7,打印print(1) # func1(1) #4,func1(1) == inner(1)
***装饰器——成功hold住所有函数传参
# import time # def timer(func): #2 ,func == func1 / 6, func == func2 # def inner(*args,**kwargs): # start = time.time() # re = func(*args,**kwargs) #10,func()==func1()调用 / 15,func()== func2()调用 # print(time.time() - start)#12 打印时间 / 18 打印时间 # return re #13 返回re /19 返回re # return inner # 3,inner == func1 7, inner == func2 # @timer # 1,func1 == timer(func1) / 4, func1 == inner # def func1(a,b): # print('in func1')#11,打印 # @timer # 5,func2 == timer(func2) / 8, func2 == inner # def func2(a): # print('in func2 and get a:%s'%(a)) #16 打印 # return 'func2 over'#17,返回‘fun2 over’给最后一行调用者 # # func1('aaaaa','bbbbb') #9,func1() == inner()调用inner函数 # print(func2('aaaaa'))