一、re模块的其他知识
二、collections模块
三、time与datetime模块
四、random模块
一、re模块补充说明
import re
ret = re.findall('(a)bc', 'abcabcabcabc')
print(ret)
ret = re.findall('a(?:b)c', 'abcabcabcabc')
print(ret)
ret = re.findall('(a)(b)(c)', 'abcabcabc')
print(ret)
ret = re.findall('(?P<aaa>a)(b)(c)', 'abcabcabc')
print(ret)

"""
findall默认的是分组优先展示,所以如果正则表达式有括号分组,在展示结果的时候,默认只演示括号内正则表达式匹配到的内容。
所以我们也可以取消分组有限展示的极致
(?:) 括号前面加问号冒号
"""
import re
ret = re.search('(a)b(c)','abcabcabcabc')
print(ret.group())
print(ret.group(0)) # 通过索引的方式单独获取分组内匹配到的数据
print(ret.group(1))
print(ret.group(2))
'''
search和match里面有几个分组,group方法括号内最大就能写到几
'''

# 分组也可以给组起别名
import re
ret = re.search('a(?P<name1>b)(?P<name2>c)', 'abcabcabcabc')
print(ret.group('name1')) # b
print(ret.group('name2')) # c
# 通过名字对应来取值
二、collections模块
1、具名元组namedtuple
from collections import namedtuple # 使用from...import..的方式直接调用模块里面的功能
# 1、建立一个元组对象模板
point = namedtuple('坐标',['x','y'])
# 2、创建诸多元组数据
p1 = point(1, 2)
p2 = point(3, 4)
print((p1, p2))
person = namedtuple('嘉宾','name age number')
person1 = person('熊大',10,1)
person2 = person('熊二',9,2)
print(person1, person2)
# 直接获取person1中的年龄
print(person1.age)

# 根据具名元组的这个特性,它的使用也相对广泛,例如在数学领域和娱乐领域等
# 获取扑克的点数
from collections import namedtuple
card = namedtuple('扑克牌',['花色', '点数'])
c1 = card('黑桃♠', '3')
c2 = card('梅花♣', '2')
c3 = card('方块◇', 'k')
print(c1, c2, c3)
# 直接查看点数
print(c2.点数)

2、双端队列deque
队列:先进先出, 默认是只有一端进,一端出
双端队列:两端都可以进出
import queue
q = queue.Queue(3) # 最多只能放三个元素
import queue
q = queue.Queue(3)
q.put(111)
q.put(222)
q.put(333)
print(q.get()) # 111
print(q.get()) # 222
print(q.get()) # 333
# 如果队列增加满了,继续增加程序就会原地等待

from collections import deque
q = deque([11, 22, 33])
print(q)
q.append(44) # 从后面增加,也就是从右边增加
print(q)
q.appendleft(123) # 从左边增加
print(q)
q.pop()
print(q) # 从后面弹出,也就是右边
q.popleft() # 从左边弹出
print(q)

3 、字典相关
# 字典的内部是无序的
d1 = dict([('name', 'jason'), ('pwd', 123), ('hobby', 'study')])
print(d1) # {'pwd': 123, 'name': 'jason', 'hobby': 'study'}
# 有序字典
from collections import OrderedDict
d1 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(d1)
d1['x'] = 111
d1['y'] = 222
d1['z'] = 333
print(d1)

小练习:
"""
有如下值集合 [11,22,33,44,55,67,77,88,99,999],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
"""
# 使用for循环来写
l1 = [11,22,33,44,55,67,77,88,99,999]
new_d = {'k1':[], 'k2':[]} # 大于66存k1,否则存k2
for i in l1:
if i > 66:
new_d['k1'].append(i)
else:
new_d['k2'].append(i)
print(new_d)
# {'k1': [67, 77, 88, 99, 999], 'k2': [11, 22, 33, 44, 55]}
# 使用defaultdict
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)
print(my_dict)

4 、计数器 Counter
# 统计字符串里面字符出现的次数
res = 'ababbbababcab'
# 使用for循环
new_dict = {}
for i in res:
if i not in new_dict:
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict) # {'a': 5, 'b': 7, 'c': 1}
# 使用counter
from collections import Counter
n = Counter(res)
print(n) # Counter({'b': 7, 'a': 5, 'c': 1})
print(r.get('a')) # 5
# 可以根据按key取值
三、time与datetime模块
1、time模块
# 常用模块
1、time.sleep(secs) # secs就是推迟的秒数
推迟指定时间运行,单位为秒
2、time.time
获取当前时间戳
# 三种用于表示时间的格式(彼此之间可以转换)
1、时间戳
距离1970年0时0分0秒带现在的秒数
time.time()
2、结构化时间
这个时间类型主要是给计算机看的
time.localtime()

3、格式化时间
时间格式 2000/1/21 11:11:11
time.strftime()
'%Y-%m-%d %H:%M:%S' # 2022-03-29 19:04:35
'%Y-%m-%d %X' # 2022-03-29 19:05:05

2、时间类型的转换
格式化时间 <==> 结构化时间 <==> 时间戳
# 时间戳<-->结构化时间
gmtime
localtime
# 结构化时间<-->格式化时间
strftime
strptime
time.strptime("2017-03-16","%Y-%m-%d")
time.strptime("2017/03","%Y/%m") 前后必须一致
ps:UTC时间比我们所在的区域时间早八个小时(时区划分)

3、datetime模块
# 调用模块
import datetime
print(datetime.date.today()) # 2022-03-29
print(datetime.datetime.today()) # 2022-03-29 19:18:33.156460
"""
date 获取的是年月日
datetime 获取的是年月日时分秒
"""
res = datetime.date.today()
print(res.year) # 2022
print(res.month) # 3
print(res.day) # 29
print(res.weekday()) # 1 星期0-6
print(res.isoweekday()) # 2 星期1-7
"""
针对时间计算的公式
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
"""
res = ctime + time_tel
print(res - ctime)
# 4 days, 0:00:00
四、random模块
'''随机数模块'''
import random
print(random.random()) # 随机产生一个0到1之间的小数
print(random.uniform(2,4)) # 随机产生一个2到4之间的小数
print(random.randint(0,9)) # 随机产生一个0到9之间的整数(包含0和9)
print(random.randint(1,6)) # 掷骰子
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
random.shuffle(l) # 随机打乱一个数据集合
print(l)
l1 = ['特等奖','一等奖','二等奖','三等奖','优秀奖']
print(random.choice(l1)) # 随机抽取一个 抽奖
print(random.sample(ll, 2)) # 随机指定个数抽样
