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))