1.装饰器
装饰器:
把一个函数当作参数,返回一个替代版的函数
本质就是一个返回函数的函数
“在不改变原函数的基础上,给函数增加功能”
有装饰器的会先执行装饰器内容
对修改是封闭的,对扩展是开放的
time.time()函数返回当前时间的时间戳(1970纪元后经过的浮点秒数)
装饰器实现一个函数计时器
1.问题1:被装饰的函数有返回值
2.问题2:如何保留被装饰函数的函数名和帮助信息文档
import time
import random
import string
import functools
li = [random.choice(string.ascii_letters) for i in range(100)]
print(li)
def Timer(fun):
"""这是一个装饰器Timer"""
def wrapper(*args,**kwargs):
"""这是一个wrapper函数"""
start_time = time.time()
res = fun(*args,**kwargs)
end_time = time.time()
print('运行时间为: %.5f' %(end_time - start_time))
return res
return wrapper
@Timer
def con_add():
s = ''
for i in li:
s += (i + ',')
print(s)
@Timer
def join_add():
print(','.join(li))
@Timer
def fun_list(n):
"""这是fun_list函数"""
return [i * 2 for i in range(n)]
@Timer
def fun_map(n):
return list(map(lambda x:x*2,range(n)))
print(fun_list.__doc__)
print(fun_list.__name__)
print(time.ctime())
计算函数运行时间
inspect.getcallargs返回一个字典,key值是形参,value值是对应的实参{‘name’:‘root’}
判断如果是‘root’用户就允许进行添加和删除操作,否则不能进行
编写装饰器required_types, 条件如下:
1). 当装饰器为@required_types(int,float)确保函数接收到的
每一个参数都是int或者float类型;
2). 当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
3). 当装饰器为@required_types(str,int)确保函数接收到的每一个参数都是str或者int类型;
4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型
多个装饰器
注意装饰器执行顺序
3.第三方模块
qrcode模块:提供生成二维码的接口
双击pip,搜索qrcode并下载安装
再下载itchat模块:实现调用微信的第三方模块
生成一个百度的二维码,扫描直接进入百度
生成一个微信二维码,扫描登录后会给你的filehelper(文件传输助手)发送一个hello,但是一次只能一个人扫
itchat还有很多有趣的地方,比如统计好友人数,男女比列等