闭包
学闭包之前,要记住这么一句话,名称空间与作用域,(作用域关系在函数定义阶段时就已经固定死了,与调用位置无关)
1、闭指的是函数是一个内部函数
2、包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用。
案例(1):
def outter():
x=1
def inner():
print(x)
return inner
f = outter()
f()
案例(2)
def outter(x)
def inner()
print(x)
return inner
f = outter()
f()
装饰器
1、什么是装饰器
器指的是工具,而程序中的函数就具备某一功能的工具。
装饰指的是为被装饰器对象添加额外功能
就目前的知识来看:
定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能
2、为什么要用装饰器
两大原则:
(1) 不修改原代码
(2)不改变原来的调用
软件的维护应该遵循开发封闭原则
开放封闭原则指的是:
软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开发的。
重点:装饰器是闭包和函数作用域、函数对象的综合实践。
案例(1)
import time def index(): print('welcome to index') time.sleep(3) def decorator(func): ''' 装饰的外层函数 :param func: :return: wrapper 的内存地址 ''' def wrapper(): ''' 被装饰的函数 :return: ''' #当前时间戳 start = time.time() #原函数》》指向index func() stop = time.time() print('the run is %s'%(stop-start)) #返回函数名,打破层级限制 return wrapper index = decorator(index) index()
案例(2)(如果装饰器有返回值怎么办)
import time def index(): print('welcome to index') time.sleep(3) return 123456 def decorator(func): ''' 装饰的外层函数 :param func: :return: wrapper 的内存地址 ''' def wrapper(): ''' 被装饰的函数 :return: ''' #当前时间戳 start = time.time() #原函数》》指向index res = func() stop = time.time() print('the run is %s'%(stop-start)) return res #返回函数名,打破层级限制 return wrapper #这里的index不是源函数index() #decorator执行的是wrapper函数 index = decorator(index) res = index() print(res)
案例(3)(带参数的函数)
import time def index(name): print('welcome %s to index page'%name) time.sleep(3) return 123456 def decorator(func): ''' 装饰的外层函数 :param func: :return: wrapper 的内存地址 ''' #这里使用*args,**kwargs的好处就是可以传参数,可以不传参数 def wrapper(*args,**kwargs): ''' 被装饰的函数 :return: ''' #当前时间戳 start = time.time() #原函数》》指向index res = func(*args,**kwargs) stop = time.time() print('the run is %s'%(stop-start)) return res #返回函数名,打破层级限制 return wrapper #这里的index不是源函数index() #decorator执行的是wrapper函数 index = decorator(index) res = index('alex') print(res)
案例(5)(python装饰器)
import time
def decorator(func):
'''
装饰的外层函数
:param func:
:return: wrapper 的内存地址
'''
#这里使用*args,**kwargs的好处就是可以传参数,可以不传参数
def wrapper(*args,**kwargs):
'''
被装饰的函数
:return:
'''
#当前时间戳
start = time.time()
#原函数》》指向index
res = func(*args,**kwargs)
stop = time.time()
print('the run is %s'%(stop-start))
return res
#返回函数名,打破层级限制
return wrapper
@decorator #index=decorator(index)
def index(name):
print('welcome %s to index page'%name)
time.sleep(3)
return 123456
#index()调用wrapper函数
index('egon')