1. random模块
1.1 基础方法
import random
# (1) 取随机小数: 数学计算
print(random.random()) # 取0-1之间的小数
print(random.uniform(1, 2)) # 取所给范围之间的小数
# (2) 取随机整数: 彩票 抽奖
print(random.randint(1, 2)) # [1,2] 顾头也顾尾
print(random.randrange(1, 2)) # [1,2) 顾头不顾尾
print(random.randrange(1, 200, 2)) # 每两个取一个(200以内的奇数)
# (3) 从一个列表中随机抽取值: 抽奖
li = ['a', 'b', (1, 2), 123]
print(random.choice(li)) # 随机取一个
print(random.sample(li, 2)) # 随机取两个
# (4) 洗牌 打乱一个列表的顺序(没有返回值,在原来的列表基础上直接进行修改,节省空间)
li = ['a', 'b', (1, 2), 123]
random.shuffle(li)
print(li)
1.2 验证码 - 课上练习
# 随机数练习
# (1) 4位 数字验证码
# (2) 6位 数字验证码
# (3) 6位 数字+字母验证码
# (1) 4位 数字验证码
s = ""
for i in range(4):
num = random.randint(0, 9)
s = s + str(num)
print(s)
# (2) 6位 数字验证码
s = ''
for i in range(6):
num = random.randrange(0, 10)
s += str(num)
print(s)
# (1)和(2)改成函数版本
def func(n=6):
s = ''
for i in range(n):
num = random.randint(0,9)
s += str(num)
return s
print(func(4))
print(func())
# (3) 6位 数字+字母验证码
# 1. 随机字母如何生成
# 2. 一个位置上 出现的是数字还是字母(小写)应该是随机事件(概率一样)
# 1. 怎么用简单的方法输出全部数字字母?
# 0在acsii码中的位置48, 0-9的位置就是48-57
# A在acsii码中的位置65, A-Z的位置就是65-90(65+25)
# a在acsii码中的位置97, a-z的位置就是97-122(97+25)
# 两种取值方法
# 1>先随机取位置范围的数字,再把数字放到chr()中,然后打印
# ret = chr(random.randint(65, 90)(
# print(ret)
# 2>把所有的位置范围循环,打印chr(位置)放在列表中,再随机
# [chr(i) for i in range(48,58)] # 所有数字
# [chr(i) for i in range(65,91)] # 所有大写字母
# [chr(i) for i in range(97,123)] # 所有小写字母
# 老师讲解的
s = ''
for i in range(6): # 重复操作6次
# 生成随机的大写字母,小写字母,数字各一个(出现的概率一样)
num = str(random.randint(0, 9)) # 随机出一个数字
alpha_upper = chr(random.randint(65, 90)) # 随机出一个大写字母
alpha_lower = chr(random.randint(97, 122)) # 随机出一个小写字母
res = random.choice([num, alpha_upper, alpha_lower]) # 把随机的三个值放在列表中,再随机取一个,这样是为了保证三个值被取到的概率相同
s += res # 把每一次随机取出来叠加到字符串s
print(s) # 最后输出的这个字符串就是6位的(数字+字母验证码)
# 自己写的
l1 = [chr(i) for i in range(48, 58)] # s数字
l2 = [chr(i) for i in range(97, 123)] # 小写字母
s = '' # 空字符串s
for i in range(6):
num = random.choice(l1) # 随机出一个数字
alpha = random.choice(l2) # 随机出一个字母
ret = random.choice([num, alpha]) # 从列表li中取一个(一个位置出现字母和数字的概率应该相同)
s += str(ret) # 把每一次随机取出来叠加到字符串s
print(s) # 最后输出的这个字符串就是6位的(数字+字母验证码)
# 函数版本
def code(n = 6):
s = ''
for i in range(6): # 实参没给就用默认值参数,给了就用给的参数
# 生成随机的大写字母,小写字母,数字各一个
num = str(random.randint(0, 9))
alpha_upper = chr(random.randint(65, 90))
alpha_lower = chr(random.randint(97, 122))
res = random.choice([num, alpha_upper, alpha_lower])
s += res
return s
print(code(4))
print(code())
1.3 字母/数字兼容的函数(3个功能)
# 字母/数字兼容的函数(3个功能)
# (1)4位 数字验证码
# (2)6位 数字验证码
# (3)6位 数字+字母验证码
# 简化代码,逻辑清晰,用最少的代码实现更多的功能
def code(n = 6, alpha = True):
s = ''
for i in range(n):
num = str(random.randint(0, 9))
if alpha:
alpha_upper = chr(random.randint(65, 90))
alpha_lower = chr(random.randint(97, 122))
num = random.choice([num, alpha_upper, alpha_lower])
s += num
return s
print(code(4, False)) # 4位数字
print(code(6, False)) # 6位数字
print(code()) # 6位的(数字+大写字母+小写字母)
2. time模块
2.1 time模块的常用方法
# time模块主要是用来和时间打交道的
# 时间格式(3种):
# 格式化时间/字符串时间: '2018-8-20' '2018.8.20' 字符串数据类型 格式化时间 - 给人看的
# 结构化时间/元组时间: 作为字符串时间和时间戳时间之间的一个中间状态来使用的
# 时间戳时间/浮点型时间: 1566448411.2815611 浮点型数据类型以s(秒)为单位 时间戳时间 - 给机器计算用的
# 1970 1 1 0:0:0
# 时间节点:1970年的1月1号的伦敦时间的0点0分0秒
# (线程)推迟指定的时间运行。单位为秒。
time.sleep(2) # 程序走到这儿会等待(休眠)2秒
# 时间戳时间/浮点型时间
print(time.time()) # 当前时间的时间戳时间1566450347.240795
# 字符串时间/格式化时间
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2019-08-22 12:50:10 当前时间的字符串时间 str format time
print(time.strftime('%y-%m-%d %H:%M:%S')) # 19-08-22 12:50:10 小写y只显示19
print(time.strftime('%c')) # 外国格式:Thu Aug 22 12:51:22 2019
# 结构化时间/元组时间
print(time.localtime()) # 当前时间的结构化时间
struct_time = time.localtime() # 北京时间
print(struct_time) # 结果: time.struct_time(tm_year=2019, tm_mon=8, tm_mday=22, tm_hour=13, tm_min=6, tm_sec=23, tm_wday=3, tm_yday=234, tm_isdst=0)
print(struct_time.tm_mon) # 从结构化时间中去取时间
# 结构化时间中的dst代表是否夏令时
# dst=0 0表示非夏令时 1表示夏令时
# 澳洲还在用
2.2 时间相关练习题
# 1. 课堂练习
# (1) 时间戳换成字符串时间
struct_time = time.localtime(1500000000) # 将时间戳时间1500000000通过localtime转换成了结构化时间(当地时间)
# print(time.gmtime(1500000000)) # 将时间戳时间1500000000装换为结构化的伦敦时间
ret = time.strftime('%y-%m-%d %H:%M:%S', struct_time) # 将结构化时间通过strftime转换成了字符串时间
print(ret)
# (2) 字符串时间 转 时间戳时间
struct_time = time.strptime('2018-8-8','%Y-%m-%d') # 先用strptime把字符串时间转成结构化时间
print(struct_time) # 打印结构化时间
res = time.mktime(struct_time) # 再用mktime把结构化时间转成时间戳时间
print(res)
# 2. 课下练习
# (1) 查看一下2000000000时间戳时间表示的年月日
struct_time = time.localtime(2000000000) # 用localtime将时间戳时间2000000000转换为结构化时间
ret = time.strftime('%Y-%m-%d', struct_time) # 用strftime将结构化时间转换为字符串时间
print(ret) # 2033-05-18
# (2) 将2008-8-8转换成时间戳时间
struct_time = time.strptime('2008-8-8','%Y-%m-%d') # 用strptime将字符串时间2008-8-8转换为结构化时间
ret = time.mktime(struct_time) # 用mktime将结构化时间转换为时间戳时间
print(ret)
# (3) 请将当前时间的当前月1号的时间戳时间取出来 - 函数
def func():
st = time.localtime() # 当前时间的结构化时间
st2 = time.strptime('%s-%s-1'%(st.tm_year,st.tm_mon),'%Y-%m-%d') # 把结构化时间里的年月取出来写成字符串格式的时间,然后用strptime结构化
return time.mktime(st2) # 将结构化的年月,通过mktime转换成时间戳时间,然后返回
print(func())
# (4) 计算时间差 - 函数
# 2018-8-19 22:10:8 2018-8-20 11:07:3
# 经过了多少时分秒
str_time1 = '2018-8-19 22:10:8'
str_time2 = '2018-8-20 11:07:3'
struct_t1 = time.strptime(str_time1, '%Y-%m-%d %H:%M:%S')
struct_t2 = time.strptime(str_time2, '%Y-%m-%d %H:%M:%S')
timestamp1 = time.mktime(struct_t1)
timestamp2 = time.mktime(struct_t2)
sub_time = timestamp2 - timestamp1 # 先把字符串时间转换成时间戳时间然后相减
gm_time = time.gmtime(sub_time) # 把时间戳时间的差 转换成 节点(伦敦时间)的结构化时间
# (利用了时间戳节点:伦敦时间1970-01-1 0:0:0)
print("过去了%d年%d月%d天%d小时%d分%d秒"%(gm_time.tm_year-1970,gm_time.tm_mon-1, gm_time.tm_mday-1,gm_time.tm_hour,gm_time.tm_min,gm_time.tm_sec))