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'))