模块篇:re、collections、time、datetime、random模块
2022.3.29正则补充和部分模块学习
- re模块的其他知识
- 正则起别名及分组机制
- collections模块
- time模块
- datetime模块
- random随机数模块
一、re模块的其他知识
1、findall()
import re
1.
目标数据加括号相当于只要括号内的数据
ret = re.findall('a(b)c', 'abcabcabcabc')
print(ret) # ['b','b','b','b']
2.
括号里再加上?:,表示取消括号的分组功能
ret = re.findall('a(?:b)c', 'abcabcabcabc')
print(ret) # ['abc', 'abc', 'abc', 'abc']
3.
目标数据加多个括号,表示多个数据分成一组
ret = re.findall('(a)(b)(c)', 'abcabcabcabc')
print(ret) # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
2、search()
import re
1.search目标数据加括号相当于没加,但是可以通过参数控制取几个数据
ret = re.search('a(b)c','abcabcabcabc')
print(ret.group()) # abc
print(ret.group(0)) # abc 0还是取所有
print(ret.group(1)) # b 通过索引获取分组内数据,索引默认从1开始,分几个组,group()最大就可写几,match方法一样
2.search可以在某个数据前加上?P<name>,表示给这个数据起别名,且不影响分组,后面可以通过.group(name)获取这个数据
ret = re.search('(?P<name>a)(b)(c)', 'abcabcabcabc')
print(ret.group('name')) # a
二、collections模块
1、namedtuple具名元组
from collections import namedtuple
1.即有名字的元组,可通过列表定义并等待传值
point = namedtuple('坐标', ['x','y']) # 左边参数是名字,右边是等待进入的数据
p1 = point(1,2) # 把1,2分别放进具名元组point内的x,y
p2 = point(3,4) # 同理可创建多个数据
print(p1,p2) # 坐标(x=1, y=2) 坐标(x=3, y=4)
2.通过字符串定义并等待传值
person = namedtuple('人物','name age gender')
p1 = person('jason',18,male) # 向person内传值
print(p1) # 人物(name= 'jason',age =18,gender='male')
print(p1.name) # jason
card = namedtuple('扑克牌',['花色','点数'])
c1 = card('黑桃','A')
c2 = card('黑梅','K')
c3 = card('红心','A')
print(c1,c2,c3) # 扑克牌(花色='黑桃', 点数='A') 扑克牌(花色='黑梅', 点数='K') 扑克牌(花色='红心', 点数='A')
print(c1.点数) # A
2、双端队列
双端队列与队列的区别
双端队列:两端都可以进出
队列:先进先出,默认是只有一端只能进另外一端只能出
import queue # 调用队列模块
q = queue.Queue(3) # 表示最大只能放三个元素
# 存放元素
q.put(123) # 存放满了再存则原地等待
# 获取元素
q.get() # 一次获取一个,取完则原地等待
from collections import deque
q = deque([1,2,3]) # 直接定义一个
print(q) # queue[1,2,3]
q.append(4) # 默认尾部右侧添加元素
print(q) # queue[1,2,3,4]
q.appendleft(0) # 左侧添加元素
print(q) # queue[0,1,2,3,4]
q.pop() # 右边尾部弹出一个元素
q.popleft # 左边头部弹出一个元素
3、OrderedDict有序字典与defaultdict
正常的普通字典是无序的,因此入药需要创建一个有序字典要用到OrderedDict()
1.OrderedDict()
from collections import OrderedDict
d1 = OrderedDict([('a',1),('b',2),('c',3)]) # 创建一个有序字典
print(d1) # {'a':1,'b':2,'c':3}
d1['d'] = 4 # 添加元素
print(d1.keys()) # 获取所有键
2.defaultdict()
练习:
有如下值集合 [11,22,33,44,55,67,77,88,99,999],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
from collections import defaultdict
values = [11, 22, 33,44,55,67,77,88,99,90]
my_dict = defaultdict(list) # 表示字典所有的值默认都是列表,可以理解为{'':[]}
for value in values:
if value > 66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
注意:使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
复制代码
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # 'abc',key1存在
dd['key2'] # 'N/A',key2不存在,返回默认值
4、Counter计数器
res = 'abcdeabcdabcaba'
'''
统计字符串中所有字符出现的次数,并组织成下面格式:
{'a':3,'b':5...}
'''
from collectons import Counter
r = Counter(res) # 创建一个计数器统计res的每个元素的个数
print(r) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
print(r.get('a')) # 跟字典一样,按key取值
三、time模块
1、常用方法
1.time.time()
获取当前时间戳
2.time.sleep(second)
睡眠,推迟程序运行时间
2、三种表示时间的格式
(1)时间戳
距离1970年1月1日0时0分0秒至此相差的秒数
time.time()
(2)结构化时间
人看起来仍然不太方便
time.localtime()
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
(3)格式化时间
人看着比较方便的一种方式:2022/3.29 19:50:55
time.strftime()
括号里面需要添加一些格式,如
import time
a = time.strftime('%Y-%m-%d %H:%M:%S')
print(a) # 2022-03-29 19:52:01 获取当前格式的时间
b = time.stftime('%Y-%m-%d %X') # 可以用%X代替
print(b) # 2022-03-29 19:53:58 获取当前格式的时间
有哪些格式呢,看下面的表,这些符号都是用来代替结构化时间中的关键字参数的:
%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 当前时区的名称
%% %号本身
(4)三种时间类型的转化
# 时间戳<-->结构化时间
gmtime # 时间戳转结构化
localtime
mktime # 结构化转时间戳
# 结构化时间<-->格式化时间
strftime # 结构化转格式化
strptime # 格式化转结构化
time.strptime("2017-03-16","%Y-%m-%d")
time.strptime("2017/03","%Y/%m") 前后必须一致
ps:UTC时间比我所在的区域时间早八个小时(时区划分)
3、datetime模块
import datetime
1.获取当前时间
print(datetime.date.today()) # 2022-03-29,获取当前日期
print(datetime.datetime.today()) # 2022-03-29 11:55:50.883392,获取当前精确时间
2.指定某时间的年月日等
res = datetime.date.today()
print(res.year) # 2022,可以指定年份
print(res.month) # 3,指定月份
print(res.day) # 29,指定天数
print(res.weekday) # 显示res这个时间的工作日,星期0-6
print(res.isoweekday) # 显示真实星期几,星期1-7
3.时间差timedelta(days=num) # 参数也可以是其他格式,比如年
c_time = datetime.datetime.today() # 当前时间
time_tel = datetime.timedelta(days=4) # 设置时间差4天
时间运算:
c_time + time_tel # 当前时间加四天
针对时间计算的公式
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
四、random模块
别名:随机数模块
import random
1.产生随机小数和整数
print(random.random()) # 随机产生一个0-1之间的小数
print(random.uniform(2,4)) # 随机产生一个2-4之间的小数
print(random.randint(0,9)) # 随机产生一个0-9之间的整数,包含0和9
2.随机打乱数据集合
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
random.shuffle(l) # 打乱数据集l
print(l)
3.随机抽取一个元素
l = [1, 2, 3, 4, 5]
print(random.choice(l)) # 随机抽取一个元素
注意:l可以是列表也可以是字符串
print(random.sample(l,2)) # 右边参数指定抽取个数
作业
1.博客内datetime相关练习
可以看答案
2.使用random模块编写一个能够产生随机验证码的代码
注意:验证码可以是数字、小写字母、大写字母 任意组合
基本要求:产生固定位数的 比如四位
拔高要求:产生指定位数的 ...
eg:
要产生四位随机验证码 J2nB
要产生五位随机验证码 JkO98
import random
def check_code(num):
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
c = random.sample(a,num)
d = {'name':''}
for i in range(len(c)):
d['name'] = d['name']+(c[i])
e = d['name']
print(e)
check_code(4) # 任意参数都可,表示验证码位数