2.装饰器的认识
2.1.什么是装饰器
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数
2.2.装饰器的功能要求
装饰器实际是软件设计模式的一种名称,他要求具备的功能是:
在不改变原函数代码的基础上,增加新的功能
“你以为穿个马甲,我就不认识你了”,这句话其实就是说的就是装饰器的意义,在不改变原有功能的基础上,在外面套一个东西,不仅不影响原有功能,还可以增加新的动作。
3.装饰器的实现
3.1.简单的装饰器
3.1.1.一个最简单的装饰行为
饰器的一个特点是:在执行原函数的基础上,增加内容。
❓ 那么,如何执行原函数那?
✔ 把原函数的名字交给装饰函数,装饰函数就具备了执行老函数的能力。
#旧函数,待装饰的函数
def fun():
print(‘我是老函数’)
def factory(old_fun):
print(’=’*20)
old_fun()
print(’=’*20)
factory(fun)
3.1.2.完善装饰行为
❓ 上面的装饰行为还有哪些问题?
◇ 需要通过装饰工厂来调用原函数,原来调用这个功能的业务部门,将大面积修改代码;
❓ 那么如何改进这个问题那?
如何设计一个方式,在不改变原函数名称的情况下,调用时也执行装饰工厂那。
◇ old_name = factory(old_name)
def fun():
print(“我是fun”)
def factory(a):
def tmp():
print("="*10)
a()
print("="*10)
return tmp
fun = factory(fun)
fun()
3.1.3.python的装饰器语法糖
old_name = factory(old_name)这句话就是生成装饰器的核心语句。为了避免每次都写这样的无脑代码,python提供了一个便捷的写法,我们称之为语法糖。
语法糖的写法:
· 找到要装饰的函数
· 在上面写上@,然后跟装饰器函数的名称
@decortate
def fun():
print(‘in fun() …’)
3.2.总结
装饰器实际也是一个函数;
接收一个老函数的名称;
返回新函数的名称;
在新函数里调用老函数;
4.随机数模块
python中的random模块用于生成随机数,当我们需要随机产生测试数据,抽奖,验证码等等,就可以利用这个模块。
4.1.random模块上的方法
接口名称 类型 说明
random.random() 实数相关 用于生成一个0到1的随机浮点数: [0, 1)
random.uniform(a,b) 生成[a,b]或[b,a]之间的均匀分布随机浮点数。
random.randint(a,b) 整数相关 生成[a,b]的随机整数,要求a < b。
random.randrange(a,b) 生成[a,b)的随机整数,第三个参数可以指定步长。
random.choice(seq) 序列相关 从序列中随机选择一个元素,若序列为空,则抛出异常。
random.shuffle(seqb) 打乱原序列,原序列必须可写。
random.sample(seq,k) 从序列中随机选择k个元素返回,原序列不变。
random.seed(n=none) 初始化 初始化随机熵池。
4.2.注意事项
random的seed,一旦用定值初始化,则每次运行的随机现象是一致的。
5.datetime模块
时间模块,是开发过程中使用比较频繁的模块,比如记录日志,用户登录时间,特定时间内的数据分析等等。
主要是使用 time 和 datetime 这两个模块。
5.1.1.time模块
在 Python 文档里,time是归类在Generic Operating System Services中,换句话说, 它提供的功能是更加接近于操作系统层面的。通读文档可知,time 模块是围绕着 Unix Timestamp 进行的,所以其所能表述的日期范围被限定在 1970 - 2038 (4个字节)之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用datetime模块更好。
接口名称 说明
time.time() 返回一个距Epoch的秒数,是浮点数。
time.gmtime(seconds) 将秒数转化为年月日时分秒,以UTC时间为标准。
time.localtime(seconds) 将秒数转化为年月日时分秒,以当地时间为标准。
time.ctime(seconds) 返回年月日时分秒的字符串。
time.asctime(tuple) 从struct_time返回年月日时分秒字符串。
time.mktime(tuple) 将struct_time转换为秒数。
time.strftime(fmt,t) 按照fmt格式将struct_time显示成字符串。
time.strptime(str,fmt) 将年月日时分秒的字符串按照fmt解析成struct_time结构。
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
5.1.2.datetime模块
datetime 比 time 高级,可以理解为 datetime 基于 time 进行了封装,提供了更多实用的函数。在datetime 模块中重要的是以下两个类:
timedelta # 主要用于计算时间跨度
datetime # 同时有时间和日期
一般使用datetime.datetime.now()获得这个实例对象。
类方法 说明
datetime.today() 当前时间,localtime。
datetime.now() 当前的时间。
datetime.utcnow() 当前格林时间。
datetime.fromtimestamp() 将时间戳的转换为时间。
datetime.strptime(str,fmt) 按照fmt的格式解析字符串生成datetime。
实例方法 说明
datetime.date() 返回一个date对象。
datetime.time() 返回time对象。
datetime.strftime(fmt) 按照fmt的格式生成字符串。
5.1.3.timedelta模块
timedelta模块主要针对的是2个日期对象的数学运算,比如当前时间的前或后1个月,2个小时这样的需求。
注意:最大的单位是天。
from datetime import datetime
res = datetime.now()
print(type(res))
print(res.timestamp())
import time
print(time.time())
data = res.strftime("%Y#%m#%d %H")
print(data)
web_data = “2017-8-8”
res1 = datetime.strptime(web_data, “%Y-%m-%d”)
print(type(res1))
res2 = res - res1
print(type(res2))
print(res2)
from datetime import timedelta
d1 = timedelta(days=7)
res3 = res - d1
print(res3)
6.哈希散列
6.1.什么是哈希算法
哈希算法,又叫散列算法。是一种从任何一种数据中创建小的“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。
6.1.1.哈希算法的特点
如果两个散列值不相同(根据同一函数),那么这两个散列值的原始输入也是不相同的(不重复)。
通过散列值是恢复不出原数据的信息(不可逆)。
6.1.2.MD5
MD5:可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致。
MD5已经广泛使用在为文件传输提供一定的可靠性方面。例如,服务器预先提供一个MD5校验和,用户下载完文件以后,用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错。
1996年后被证实存在弱点,无法防止碰撞(collision),可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。
6.1.3.SHA-2
SHA-2,名称来自于安全散列算法2(Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,由美国国家标准与技术研究院(NIST)在2001年发布。
其中最常用的是:SHA-256、SHA-512
6.2.python中如何使用
所有安全散列算法,都在hashlib标准库里进行了管理,要使用其中的算法,首先导入hashlib库,然后使用里面的函数即可。
6.2.1.md5
1.字符串加密:
import hashlib
test_data = b‘abc123’
print(hashlib.md5(test_data).hexdigest())
2.使用MD5对文件进行校验:
初始化算法库
使用实例化对象的update方法添加数据
使用实例化对象的hexdigest方法获得散列值
下载地址:http://ff.sdo.com/web7/down/download.html
6.2.2.sha256
#设计一个校验文件的sha256的值
def create_sha256(filename):
obj = hashlib.sha256()
with open(filename, ‘rb’) as fp:
buf = fp.read(1024)
while buf:
obj.update(buf)
buf = fp.read(1024)
return obj.hexdigest()
data = create_sha256(‘D:/xampp/ctlscript.bat’)
print(data)
print(len(data))