第十一章 常用模块
一、re模块
引入:
import re
注:永远不要起一个py文件的名字:这个名字和你已知的模块同名。
1、查找
findall:匹配所有,每一项都是列表中的一个元素
ret = re.findall('\d+', 'abc123efg456')
ret = re.findall("\d", "abc123def456")
search:只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法获取结果。
如果没有匹配到,会返回None,使用group会报错
ret = re.findall('\d+', 'abc123efg456') print(ret) # 内存地址,这是一个正则匹配的结果 print(ret.group()) # 通过ret.group()获取真正的结果 # if ret : # 内存地址,这是一个正则匹配的结果 # print(ret.group()) # 通过ret.group()获取真正的结果
match:从头开始匹配,相当于search中的正则表达式加上^(从首位开始)
2、替换、切割
split:切割
set = re.split('\d+', 'abc123efg456') #正则表达式切割字符串 print(set)
sub:替换 替换正则 新的 原字符串 (替换次数)
s = 'abc123efg456' ret = re.sub('\d+', 'H', s, 1) print(ret) ==>abcHefg456
subn:替换后返回一个元组,第二个元素为替换的次数
s = 'abc123efg456' ret = re.subn('\d+', 'H', s) print(ret) ==>('abcHefgH', 2)
3、re模块的时间复杂度和空间复杂度的处理
compile:节省使用正则表达式解决问题的时间
先将正则表达式进行编译,成为字节码保存,后面随时调用,不用多次编译。
ret = re.compile('\d+') # 完成编译了 res = ret.findall('abc123efg456') print(res) res = ret.search('abc123efg456hig789', 8, 10) # 定义了索引范围 print(res.group())
finditer:节省使用正则表达式解决问题的空间复杂度
返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值
ret = re.finditer('\d+', 'abc123efg456') print(ret) # 一个迭代器 for i in ret: print(i.group())
二、random模块
引入:
import random
- 取随机整数:彩票 抽奖
random.randint(n, m):取范围内的整数(顾头也顾尾),没有步长
random.randrang(n, m, k):取范围内整数(顾头不顾尾),k为步长
print(random.randrange(1, 10, 2)) # 1-10之间的随机奇数
- 取随机小数
random.random(): 取0-1之间的小数
random.uniform(n,m): 取范围n-m内的小数
print(random.uniform(1, 3))
- 从一个列表中随机抽取值:抽奖
random.choice(list):抽取一次,多次执行可能会抽取同样的值
random.sample(list, n):从列表中随机抽取n个值,这些值不会重复
l = ['a', 'b', (1, 2), 123] print(random.choice(l)) # 取值会重复 print(random.choice(l)) print(random.choice(l)) print(random.choice(l)) print(random.sample(l, 4)) # 第二个参数超过了列表长度就会报错 ==>123 123 b b [123, 'b', (1, 2), 'a']
- 打乱一个列表的顺序:洗牌
random.shuffle(list):改变原列表的顺序(可以节省空间)
l = ['a', 'b', (1, 2), 123] random.shuffle(l) # 在源列表上进行操作 print(l)
四位数验证码:
s = "" for i in range(4): num = random.randint(0, 9) s += str(num) print(s)
六位数验证码:
def code(n=6): # 默认为六位 s = "" for i in range(n): num = random.randint(0, 9) s += str(num) return s print(code())
数字加字符串验证码:
# 循环版 s = "" for i in range(4): # print(chr(65)) # 大写字母A num = str(random.randint(0, 9)) # 生成随机字母 alpha_upp = chr(random.randint(65, 90)) alpha_low = chr(random.randint(97, 122)) res = random.choice([num, alpha_low, alpha_upp]) # 随机抽取可重复列表元素 s += res print(s) # 函数版 def code(n=6): s = "" for i in range(n): num = str(random.randint(0, 9)) alpha_upp = chr(random.randint(65, 90)) alpha_low = chr(random.randint(97, 122)) res = random.choice([num, alpha_low, alpha_upp]) s += res return s print(code(4)) print(code()) # 进阶版 能够选择是否需要字母 默认6位 def code(n=6, alpha=True): s = '' for i in range(n): num = str(random.randint(0, 9)) if alpha: alpha_upp = chr(random.randint(65, 90)) alpha_low = chr(random.randint(97, 122)) num = random.choice([num, alpha_low, alpha_upp]) s += num return s print(code(4, False)) print(code())
三、time模块
主要用来和时间打交道
引入:
import time
- 常用方法
time.sleep(secs)
(线程)推迟指定的时间运行,单位为秒。
表示时间的三种方式:
字符串数据类型:2018-8-20 格式化时间 —— 给人看的
结构化时间(元组):用来操作的的时间
浮点型数据类型:1534732946.449629 以s为单位 时间戳时间 —— 给计算机看的
1. 时间戳(timestamp)
时间戳表示的是从1970年1月1日00:00:00开始计算按秒计算的偏移量。
print(time.time()) # 获取当前时间戳1534765615.9471586 print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2018-08-20 19:48:23
2.格式化时间
- strftime()
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2018-08-20 19:43:17 print(time.strftime('%c')) # Mon Aug 20 19:43:17 2018 (国外了解)
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 当前时区的名称 %% %号本身
3.结构化时间:
- localtimetime()
print(time.localtime()) # 北京时间 ==>time.struct_time(tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=19, tm_min=51, tm_sec=5, tm_wday=0, tm_yday=232, tm_isdst=0)
struct_time元组:
共有九个元素:(年,月,日,时,分,秒,一年中的第几周,一年中的第几天等)
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为0 |
4.时间格式互换
# time时间格式互换 # 格式化时间==>时间戳 fs = time.strftime('%Y-%m-%d %H:%M:%S') st = time.strptime(fs, '%Y-%m-%d %H:%M:%S') ts = time.mktime(st) print(ts) print(time.time()) # 时间戳==>格式化时间 ts = time.time() st = time.localtime(ts) fs = time.strftime('%Y-%m-%d %H:%M:%S', st) print(fs) print(time.strftime('%Y-%m-%d %H:%M:%S')) # 计算时间差 def func(str_time1, str_time2): 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) # 将时间戳转换为结构化时间 return 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)) # 减去时间戳元年得到结果 str_time1 = '2018-8-19 12:00:00' str_time2 = time.strftime('%Y-%m-%d %H:%M:%S') # 获取当格式化时间 func(str_time1, str_time2)
三、sys模块:sys模块是和Python解释器打交道的
1 argv
sys.argv