python 基础篇 第十节课
装饰器
本质就是函数
功能:为其他函数添加附加功能
原则:1不修改被修饰函数的源代码
2不修改被修改函数的调用方式
装饰器的知识储备:
装饰器=高阶函数+函数嵌套+闭包
高阶函数:
1函数接受参数时一个函数名
2函数的返回值是一个函数名
3满足上述任意一个都可称之为高阶函数
函数嵌套:
def father(name): print("from father %s" %name) def son(): print("from son") def grandson(): print("from grandson") grandson() son() father("孔令月") #输出 # from father 孔令月 # from son # from grandson
装饰器的架子:
import time def timmer(func): def wrapper(): start_time = time.time() res= func() func() stop_time = time.time() print("运行时间%s" %(stop_time-start_time)) return res return wrapper @timmer def test(): time.sleep(2) print("test函数运行完毕") return"这就是返回值" res = test() print(res) #输出 # test函数运行完毕 # test函数运行完毕 # 运行时间4.001586198806763 # 这就是返回值
加上参数
import time def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() res= func(*args,**kwargs) stop_time = time.time() print("运行时间%s" %(stop_time-start_time)) return res return wrapper @timmer def test(name,age): time.sleep(2) print("test函数运行完毕,名字是[%s],年龄是[%s]"%(name,age)) return"这就是test的返回值" res = test("孔令月", "18") print(res) @timmer def test1(name,age,gender): time.sleep(1) print("test函数运行完毕,名字是[%s],年龄是[%s],性别是[%s]"%(name,age,gender)) return"这就是test的返回值" res1 = test1("alex",18,"male") print(res1) #输出 # test函数运行完毕,名字是[孔令月],年龄是[18] # 运行时间2.0000550746917725 # 这就是test的返回值 # test函数运行完毕,名字是[alex],年龄是[18],性别是[male] # 运行时间1.0000779628753662 # 这就是test的返回值
解压序列:
a,b,c=(1,2,3)
a----->1
b----->2
c----->3
l=[1,3,5,98,6,14,6,6,2]
a,_*,c=l
a------->1
c------->2
a,_*d,c=l
d------->[3,5,98,6,14,6,6]
闭包函数为函数加上认证功能
def auth_func(func): def wrapper(*args,**kwargs): username = input("请输入用户名:") passwd = input("请输入密码:") if username == "孔令月" and passwd == "951753": res = func(*args,**kwargs) return res else: print("用户名或密码错误") return wrapper @auth_func def index(): print("欢迎来到淘宝") @auth_func def home(name): print("欢迎%s回家" %name) @auth_func def shopping_car(name): print("%s购物车里有[%s,%s,%s]"% (name,"iphone","篮球鞋","书")) index() home("孔令月") shopping_car("孔令月")
不用重复输入用户名和密码
user_dic = {"username":None,"login":False}
def auth_func(func):
def wrapper(*args,**kwargs):
if user_dic["username"] and user_dic["login"]:
res = func(*args,**kwargs)
return res
username = input("请输入用户名:").strip()
passwd = input("请输入密码:").strip()
if username == "孔令月" and passwd == "951753":
user_dic["username"]=username
user_dic["login"]=True
res = func(*args,**kwargs)
return res
else:
print("用户名或密码错误!")
return wrapper
@auth_func
def index():
print("欢迎来到淘宝")
@auth_func
def home(name):
print("欢迎%s回家" %name)
@auth_func
def shopping_car(name):
print("%s购物车里有[%s,%s,%s]"% (name,"iphone","篮球鞋","书"))
index()
home("孔令月")
shopping_car("孔令月")
user_list = [{"name":"孔令月","passwd":"123"},{"name":"科比","passwd":"123"},{"name":"韦德","passwd":"123"}]
user_dic = {"username":None,"login":False}
def auth_func(func):
def wrapper(*args,**kwargs):
if user_dic["username"] and user_dic["login"]:
res = func(*args,**kwargs)
return res
username = input("请输入用户名:").strip()
passwd = input("请输入密码:").strip()
for a in user_list:
if username == a["name"] and passwd == a["passwd"]:
user_dic["username"]=username
user_dic["login"]=True
res = func(*args,**kwargs)
return res
else:
print("用户名或密码错误!")
return wrapper
@auth_func
def index():
print("欢迎来到淘宝")
@auth_func
def home(name):
print("欢迎%s回家" %name)
@auth_func
def shopping_car(name):
print("%s购物车里有[%s,%s,%s]"% (name,"iphone","篮球鞋","书"))
index()
home("就想把这个用户名调用到这儿怎么就这么难")
shopping_car("就想把这个用户名调用到这儿怎么就这么难")
带参数验证功能装饰器
未完成

浙公网安备 33010602011771号