以下主要是针对Python3中shelve模块、pickle模块、random模块、math模块介绍和示例。
math模块
math模块包含了一些数学计算的函数,例如平方根函数、正余弦函数、正余切函数、角度与弧度转换函数等等。
不过,一般数学函数的用途比较少,这里只做一些简单的举例。
pi:保存了圆周率的变量
ceil(x):向上取整函数,返回参数x向上相邻的整数,如果参数为整数,返回原值。
floor(x):向下上取整函数,返回参数x的整数部分,如果参数为整数,返回原值。
fsum(iterable):求和函数,返回值为可迭代参数中的所有数值的和。
pow(x,y)):幂计算函数,返回参数x的y次方。
sqrt(x):平方根计算函数,返回参数x的平方根。
示例代码:
import math
print(math.pi) # 圆周率,显示输出结果为:3.141592653589793
print(math.ceil(1.1)) # 向上取整,显示输出结果为:2
print(math.floor(1.9)) # 向下取整,显示输出结果为:1
print(math.fsum([1.2, 2.24, 5.58])) # 求和,显示输出结果为:9.02
print(math.pow(2,3)) # 幂计算,显示输出结果为:8.0
print(math.sqrt(4)) # 平方根将计算,显示输出结果为:2.0
random模块
random模块是关于随机数的模块。
随机数的应用比较常见,所以对这个模块的了解比较重要。
同样,我先把模块中的常用功能一一列出。
random():返回值为0~1之间的随机小数。(长度为小数点后18位)
uniform(a, b):返回值为大于等于参数a且小于参数b的随机小数。
randint(a, b):返回值为大于等于参数a且小于等于参数b的随机整数。
randrange(start, stop[, step]):返回值为一定范围内的随机整数。参数start为起始数值,参数stop为终止数值(返回值不包含终止数值),参数step为步长。只输入一个参数(stop)时,返回值为大于等于0且小于参数数值的随机整数。
choice(seq):返回值为参数序列中的某一元素。
choices(population, weights=None, *, cum_weights=None, k=1):返回值为参数k大小的元素列表,列表中元素可重复,列表元素来自于参数population。参数weights为相对权重列表,列表中的元素个数与参数population相同,参数weights中元素数值大小决定参数population中相同位置元素的权重(可以理解为随机概率),权重越高随机出现概率越大。参数cum_weights是累积权重列表,累积权重通过相对权重计算,例如相对权重[1,5,1]等同于累积权重[1,6,7],即[(0+1),(1+5),(1+5+1)]。使用累积权重有更高的执行效率。
random.sample(population, k):返回值为参数k大小的元素列表,列表中元素不重复,列表元素来自于参数population。
shuffle(x):返回值为重新随机排序的序列,参数x为序列。如果对不可变序列重新随机排序,可以使用sample(x, k=len(x))。
getrandbits(k):返回值为整数,返回值的二进制数值长度为k。例如,k为2时,返回值为0,1,2,3之一,即(00,01,10,11)之一。
示例代码:
import random
print(random.random()) # 显示输出结果为0~1之间的小数。(小数点后18位数字)
print(random.uniform(0, 10)) # 显示输出结果为大于等于0且小于10的随机小数。
print(random.randint(0, 10)) # 显示输出结果为大于等于0且小于等于10的随机小数。
print(random.randrange(0, 10, 2)) # 显示输出结果为0、2、4、6、8中的某个数字。
print(random.choice(['好帅', '好酷', '好厉害', '棒棒哒'])) # 显示输出结果为列表中某一元素。
print(random.choices([1, 2, 3], cum_weights=[1, 6, 7], k=2)) # 显示输出结果为基于首个参数列表的长度为2的随机列表。
print(random.choices([1, 2, 3], [1, 5, 1], k=2)) # 显示输出结果为基于首个参数列表的长度为2的随机列表。
print(random.sample([1, 2, 3, 4, 5], 2)) # 显示输出结果为基于首个参数列表的长度为2的随机列表。
lst = [1, 2, 3, 4, 5]
random.shuffle(lst) # 列表元素随机改变位置。
print(lst) # 显示输出结果为被随机重排位置的列表。
print(random.getrandbits(2)) # 显示输出结果为0~3的随机整数,参数为随机整数对应的二进制数字的最大位数。
接下来,我们通过随机数来完成获取4位包含字母与数字的随机验证码(字符可重复)。
示例代码:
code = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=4))
# 通过join()方法,将可迭代对象中的字符连接为字符串,这个方法通过字符串分隔符(''为不添加分隔符)调用。
print(code) # 显示输出结果类似于:n22r
最后,说明一下,random模块所获取的随机数是伪随机数。
伪随机数不是假随机数的意思,伪随机数确实能够获取到每次不同的随机数值,能够满足我们一般获取随机数的需求。
但是,因为伪随机数是通过不断变化的随机数种子(例如:系统时间),通过特定的算法得到的随机数,因此,伪随机数具有一定的规律,它可以被预测。
如果想获取安全性更高的接近真正随机性的随机数,可以使用os模块中的urandom()函数或者当前模块中的SystemRandom类。
pickle模块
pickle模块用于对象持久化,也就是将内存中的对象保存到可永久保存的存储设备中(例如:磁盘)。
pikle模块提供简单的持久化功能,包含两个主要函数(此处仅列出必填参数):
dump(obj, file):将对象obj序列化并存储到文件对象file中。
load(file):按dump的顺序,依次读取文件对象(file)中每次dump的内容。
示例代码:
import pickle
path = r'C:\Users\Administrator\Desktop\date.dat'
with open(path, 'wb+') as file: # 打开文件进行序列化操作
user = ['小明', '男', '18', '帅']
learn = ['Python', 'Axure']
pickle.dump(user,file) # 数据倾出到文件
pickle.dump(learn,file) # 数据倾出到文件
user.append('很厉害')
pickle.dump(user, file) # 数据倾出到文件(不会覆盖上次倾出)
with open(path,'rb+') as file: # 打开文件进行反序列化操作
print(pickle.load(file)) # 显示输出结果为:['小明', '男', '18', '帅']
print(pickle.load(file)) #显示输出结果为:['Python', 'Axure']
print(pickle.load(file)) #显示输出结果为:['小明', '男', '18', '帅', '很厉害']
print(pickle.load(file)) # EOFError: Ran out of input(文件末端异常:输入已耗尽)
shelve模块
使用pickle模块虽然能够进行数据的持久化,但是大家也能够看到,dump操作可以进行多次,load操作却只能按照dump的顺序依次读取一次。
如果我们想要实现比较灵活的dump和load操作,可以使用shelve模块。
shelve模块对pickle模块进行了封装,可以持久化所有pickle所支持的数据类型。
通过shelve模块创建的文件存储的是一个字典。
这个模块只提供了一个open()函数,用于打开持久化的字典,进行数据的持久化和读取操作。
open(filename, flag=’c’, protocol=None, writeback=False):参数filename为文件名或文件路径;参数flag可选值为’c’(create:不存在则创建)和’n’(new:新建空文件);参数protocol为整数值,数值1、2可支持早期Python版本对文件的读取;参数writeback默认为False,即不将缓存写回打开的文件,当需要写回时,需要指定为True。
open()函数会创建一个DbfilenameShelf对象,对这个对象的操作和字典一样。
但是,要注意,键值必须是字符串。
示例代码:
import shelve
path = r'C:\Users\Administrator\Desktop\date'
with shelve.open(path, 'c', writeback=True) as dat: # 打开已有文件或创建新文件
dat['user'] = ['小明', '男', '18', '帅'] # 数据添加字典
dat['learn'] = ['Python', 'Axure']
print(dat['user']) # 显示输出结果为:['小明', '男', '18', '帅']
print(dat['learn']) # 显示输出结果为:['Python', 'Axure']
dat['user'].append('很厉害')
# 参数writeback为False时,append所做的修改不会被写回。print(dat['user'])的结果仍然为:['小明', '男', '18', '帅']
print(dat['user']) # 显示输出结果为:['小明', '男', '18', '帅', '很厉害']