Python 基础第十一天(闭包和装饰器初识)
今日内容:
函数名的应用
闭包
装饰器的初识
装饰器的传参
1.函数名的应用
函数名是函数的名字.
本质:变量,特殊的变量。是函数的内存地址
函数名() 可以执行此函数
(1)单独打印函数名,可以得到函数的内存地址:
print(func1) # <function func1 at 0x0000000000872378>
(2)函数名可以赋值
例:
def func2():
print(666)
#
f = func2
print(f())
(3)函数名可以作为容器类数据的元素。
例:
def f1():
print('f1')
def f2():
print('f2')
def f3():
print('f3')
l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#调用
l[0]()
d['f2']()
(4)函数可以作为参数
def f1():
print(666)
def f2(x): # x = f1
x() # f1()
f2(f1)
(5)函数名可以作为函数的返回值
def wraaper():
def inner():
print(666)
return inner
ret = wraaper() # inner
ret() # inner()
#此代码的流程分析
代码由 上而下,def 设置了一个wraaper的变量名,由于没有引用变量,一直向下,到达,ret = wraaper(),看到变量赋值,优先计算等号右边的,即wraaper(),引用wraaper()函数,然后进入下一层, def inner(),记录变量名称,不走变量体,return返回inner,函数结束.return将inner返回给函数调用者,wraaper(),即ret = inner
然后运行代码inner(),然后找到局部空间内的inner函数,继续执行inner下面的内容.直到代码结束.
2.闭包
就是内层函数对外层函数(非全局)变量的引用。
python遇到闭包,有一个机制,会开辟一个空间,将闭包中的所有的变量等存储起来,不随着函数的结束而关闭。
闭包的完美体现:装饰器。
如何判断:内层函数名.__closure__ cell 就是=闭包
例题
def wraaper1():
name = '老男孩'
def inner():
print(name)
inner()
print(inner.__closure__)
wraaper1()
# cell返回,则是闭包
name = '老男孩'
def wraaper2():
name1 = 'alex'
inner()
print(name)
print(name1)
print(inner.__closure__) # None
wraaper2()
变量name为全局变量,不属于外层函数的,所以不是闭包
装饰器初识:
什么是装饰器:
装饰器是在不改变现有函数的调用方式的情况下,对函数功能改变或者添加新的功能的新函数叫做装饰器.
也可以描述为在不改变原函数的执行的情况下,为原函数增加额外的功能
装饰器的固定格式:(被装饰函数带参数的装饰器)
def wrapper(funcl):
def inner(*args,**kwargs):
'''被装饰函数运行之前''
retsalt = funcl(*args,**kwargs)
'''被装饰函数运行之后'''
return retsalt
return inner
@wrapper #funcl = wrapper(funcl) 可以理解为这个等式这种形式 @wrapper 叫做语法糖
def funcl(a,b)
pass
funcl()
例题:(不带参数版本)
def timmer(f): # f = func1
def inner():
start_time = time.time()
f() # func1()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return inner
# 语法糖@
@timmer # func1 = timmer(func1)
def func1():
print('你有病呀,领导,测试我的执行效率干甚。')
func1() # inner()
例题(被装饰函数带参数的版本)
def timmer(f): # f = func1 函数名
def inner(*args,**kwargs):
start_time = time.time()
f(*args,**kwargs)
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return inner
@timmer # func1 = timmer(func1) # inner
def func1(a,b):
print(a,b)
print('你有病呀,领导,测试我的执行效率干甚。')
func1(a,b)
如果能把这个过程理解了就明白了,装饰器的基本流程.