闭包
学闭包之前,要记住这么一句话,名称空间与作用域,(作用域关系在函数定义阶段时就已经固定死了,与调用位置无关)
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')