闭函数:被封闭起来的函数=>定义函数内部的函数;闭函数的特点是只能在函数内用
def outter():
x = 100
def wrapper():
print(x)
包函数:该函数引用了一个名字,该名字是来自与e这一层的
总结:闭包函数指的是定义在函数内部的函数引用了一个来自于外层函数作用域中的名字
闭包函数升级:结合函数对象
def outter():
x = 100
def wrapper():
print(x)
return wrapper # 千万不要加括号
f = outter()
print(f)
def foo():
x = 666
f()
foo()
学闭包函数学到了一种为函数体传参的新的方案
为函数体传参有两种解决方案
方案一:直接以参数的形式传入
def wrapper(x):
print(x)
wrapper(100)
方案二:
def outter(x):
def wrapper():
print(x)
return wrapper # 千万不要加括号
f = outter(100)
f()
闭包函数的应用-装饰器
1、什么是装饰器
装饰器指的是装饰对象的一种工具,装饰指的则是为被装饰对象添加新功能
但是实现装饰器必须遵循的原则是"开放封闭原则"
开放指的是对拓展新功能是开放的,封闭指的则是对修改源码以及调用方式是封闭的
综上装饰器指的是我们要创建一个工具,该工具可以在遵循原则1和2的前提下还能为被装饰对象添加新功能
原则1、不修改被装饰对象源代码
原则2、不修改被装饰对象调用方式
2、为什么用装饰器
这样做如果更新新功能出现问题可以快速回稳
3、如何实现装饰器
装饰器----------函数
被装饰对象-------函数
准备被装饰者
import time
def index():
print('from index')
time.sleep(3)
index()
方案一改变了源代码
import time
def index():
start = time.time()
print('from index')
time.sleep(3)
end = time.time()
print(f"run time is {end - start}")
index()
方案二 装饰器的功能需要重复编写造成代码冗余
import time
def index():
print('from index')
time.sleep(3)
start = time.time()
index()
end = time.time()
print(f"run time is {end - start}")
方案三 调用方式变了且代码被写死了
import time
def index():
print('from index')
time.sleep(3)
def wrapper():
start = time.time()
index()
end = time.time()
print(f"run time is {end - start}")
wrapper()
方案四
import time
def index():
print('from index')
time.sleep(3)
def outter(index):
def wrapper():
start = time.time()
index()
end = time.time()
print(f"run time is {end - start}")
return wrapper
index = outter(index)
index()
方案五
import time
def index():
print('from index')
time.sleep(3)
def home(name):
print(f"welcome {name} to home page")
time.sleep(0.5)
def outter(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(f"run time is {end - start}")
return (res)
return wrapper
home = outter(home)
index = outter(index)
res = home('holmes')
print(res)
index()
装饰器语法糖
import time
def outter(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(f"run time is {end - start}")
return (res)
return wrapper
@outter
def index():
print("from index")
time.sleep(3)
@outter
def home(name):
print(f"welcome {name} to *")
time.sleep(0.5)
res = home('holmes')
print(res)
index()
装饰器模版
def deco(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
用户登录装饰器
def auth(func):
def wrapper(*args, **kwargs):
inp_name = input('username:').strip()
inp_pwd = input('password:').strip()
if inp_name == 'lu' and inp_pwd == '345':
res = func(*args, **kwargs)
return res
else:
print('登陆失败')
return wrapper
@auth
def index():
print('from index')
time.sleep(3)
index()
时间装饰器
import time
def timmer(func):
def wrapper1(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper1
装饰器应用
import time
def timmer(func):
def wrapper1(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper1
def auth(func):
def wrapper2(*args, **kwargs):
inp_user = input('Username: ').strip()
inp_pwd = input('Password: ').strip()
if inp_user == 'egon' and inp_pwd == '123':
res = func(*args, **kwargs)
return res
else:
print('登录失败')
return wrapper2
@auth
@timmer
def index():
print('====>index')
time.sleep(3)
index()