函数名,闭包,装饰器

中心主题
函数名      学名:第一对象
def func():
pass
print(func) 查看函数名的内存地址
函数名可赋值给其他变量 f = func
函数名可以作为容器类变量的元素 [func,]等
函数名可以作为函数的参数
def func1(f):
f()
函数名可以作为函数的返回值
def f():
return func
闭包
内层函数,对外层函数(非全局)的变量的引用,叫做闭包
def wrapper():
name = 'alex'
def inner():
print(name)
inner()
判断方法
在函数内使用print(inner.__closure__),cell--是闭包,None--不是
闭包作用:python内部有一个机制,遇到闭包,
他会在内存中开启一个内存空间,不会随着函数的结束而关闭
避免内存空间的频繁开关,保护内存
装饰器
作用:在不修改代码的前提下增加函数功能
简单的装饰器
def timmer(f):
def inner():
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner
@timmer # func = timmer(func)
def func():
print('嘻嘻更健康')
func() # inner()
@ 语法糖
@ 与被装饰函数紧密相连,中间不得有空行
带有参数的装饰器
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
f(*args,**kwargs)
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner

@timmer # func = timmer(func)
def func(a):
print('%s嘻嘻更健康'%a)
被装饰函数参数个数不等,因此内层函数使用不定长参数
带有返回值的装饰器
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
ret = f(*args,**kwargs) # 222
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return ret
return inner

@timmer # func = timmer(func)
def func(a):
return 222
print(func('萌哥'))
内层函数将被装饰的函数运行结果返回,外层函数将内层函数函数名返回
通用装饰器
def wrapper(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
return ret
return inner

@wrapper
def func():
print(66)
func()

原文地址:https://www.cnblogs.com/2018-01-30/p/8405683.html