Python基础篇---re模块补充,collections,time,datetime和random模块

本章内容

       • re模块补充

       • collections模块

       • queue模块

       • time模块

       • datetime模块

       • random模块

re模块补充


findall的分组优先

findall方法默认是分组优先展示的。正则表达式中如果有括号分组,那么在展示匹配结果的时候,默认只演示括号内正则表达式匹配到的内容。

取消分组优先展示的机制,使用(?:) 括号前面加问号冒号即可取消。

import re
ret = re.findall('a(b)c', 'abcabcabcabc')   # 优先展示b
print(ret)  # ['b', 'b', 'b', 'b']   
ret = re.findall('a(?:b)c', 'abcabcabcabc')  # 取消优先展示
print(ret)  # ['abc', 'abc', 'abc', 'abc']
ret = re.findall('(a)(b)(c)', 'abcabcabcabc')  # 优先展示a b c 分组
print(ret)   # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]

search也有分组的功能,还可以起别名

search可以用group()通过索引的方式单独获取分组内匹配到的数据。

需要注意的是当索引值位0的时候输出内容与不加参数一致,search可以通过(?P<name>b)的方式给分组起名。

import re
ret = re.search('a(b)c', 'abcabcabcabc')
print(ret.group())  # abc
print(ret.group(0))  # abc   0是默认值,输出内容与不加参数一致
print(ret.group(1))  # b        可以通过索引的方式单独获取分组内匹配到的数据
ret = re.search('a(b)(c)', 'abcabcabcabc')
print(ret.group())  # abc
print(ret.group(0))  # abc   0是默认值,输出内容与不加参数一致
print(ret.group(1))  # b        可以通过索引的方式单独获取分组内匹配到的数据
print(ret.group(2))  # c        可以通过索引的方式单独获取分组内匹配到的数据
'''针对search和match有几个分组 group方法括号内最大就可以写几'''

# 分组之后还可以给组起别名
ret = re.search('a(?P<name1>b)(?P<name2>c)', 'abcabcabcabc')
print(ret.group('name1'))  # b
print(ret.group('name2'))  # c

 

 

collections模块


 collections模块为我们提供了更多的数据类型。

1.namedtuple(),具名元组

from collections import namedtuple
# 1.先产生一个元组对象模板
point = namedtuple('坐标',['x','y'])
# 2.创建诸多元组数据
p1 = point(4,2)
p2 = point(19,1)
print(p1,p2)  # 坐标(x=4, y=2) 坐标(x=19, y=1)
print(p1.x)  # 4
print(p1.y)  # 2
person = namedtuple('学生','name age')
p1 = person('jason',18)
p2 = person('tom',28)
print(p1,p2)  # 学生(name='jason', age=18) 学生(name='kevin', age=28)
print(p1.name,p1.age)  # jason 18

2.deque(),双端队列

import queue
q = queue.Queue(3)  # 最大只能放三个元素
# 存放元素
q.put(123)
q.put(321)
q.put(222)
q.put(444)  # 如果队列满了 继续添加则原地等待
# 获取元素
print(q.get())  # 123
print(q.get())  # 321
print(q.get())  # 222
print(q.get())  # 如果队列空了 继续获取则原地等待
队列:先进先出,默认是只有一端只能进另外一端只能出
#  双端队列:两端都可以进出
from collections import deque
q = deque([1, 2, 3])
print(q)
q.append(444)  # 右边添加元素
print(q)
q.appendleft(666)  # 左边添加元素
print(q)
q.pop()  # 右边弹出元素
q.popleft()  # 左边弹出元素

3.OrderedDict(),有序字典

# 无序字典
d1 = dict([('name','jason'),('pwd',123),('hobby','study')])
print(d1)  # {'pwd': 123, 'name': 'jason', 'hobby': 'study'}
print(d1.keys())
# 有序字典
from collections import OrderedDict
d2 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(d2)
d2['x'] = 111  # 给d2传键值对
d2['y'] = 222
d2['z'] = 333
print(d2)
print(d2.keys())
# 方法一
l1 = [11,22,33,44,55,67,77,88,99,999]
new_dict = {'k1':[],'k2':[]}
for i in l1:
    if i > 66:
        new_dict['k1'].append(i)
    else:
        new_dict['k2'].append(i)
print(new_dict)  # {'k1': [67, 77, 88, 99, 999], 'k2': [11, 22, 33, 44, 55]}
# 方法二
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)  # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [67, 77, 88, 99, 90]})
练习题

4.Counter(),计数器

res = 'abzabadasdzxcabasdzcz'
'''
统计字符串中所有字符出现的次数并以字典的方式存储
'''
# 方法1 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': 6, 'b': 3, 'z': 4, 'd': 3, 's': 2, 'x': 1, 'c': 2}
# 方法2 counter计数
from collections import Counter
r = Counter(res)
print(r)  # Counter({'a': 6, 'z': 4, 'b': 3, 'd': 3, 's': 2, 'c': 2, 'x': 1})
print(r.get('a'))  # 6 可以当成字典使用

queue模块


 

# 生成队列
import queue
q = queue.Queue(3)  # 最大只能放三个元素
# 存放元素
q.put(123)
q.put(321)
q.put(222)
q.put(444)  # 如果队列满了 继续添加则原地等待
# 获取元素
print(q.get())  # 123
print(q.get())  # 321
print(q.get())  # 222
print(q.get())  # 如果队列空了 继续获取则原地等待

 

time模块


常用方法

time.sleep(secs)
        推迟指定的时间运行,单位为秒
        ps:该方法贯穿前后(基础、后期)
time.time()
        获取当前时间戳

time有三种用于表示时间的格式,且彼此中间可以转换。

1.时间戳

距离1970年1月1日0时0分0秒至此相差的秒数  
time.time()

2.结构化时间

该时间类型主要是给计算机看的,人看起来不太方便
time.localtime()
localtime([seconds]) ->(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
索引 属性
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.格式化时间

人最容易接收的一种时间格式  2000/1/21 11:11:11
print(time.strftime('%Y-%m-%d %H:%M:%S'))  # 2022-03-29 20:59:26
print(time.strftime('%Y-%m-%d %X'))  # 2022-03-29 20:59:26
格式化时间符合
符合 说明
%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 当前时区的名称
%% %号本身

PS:记住一些常用的即可 其他的全部记录到自己的博客 以后能找到就行!!!

时间类型的转换

 

datetime模块


基本操作

import datetime  # 导入模块
print(datetime.date.today())  # 2022-03-29  date  年月日
print(datetime.datetime.today())  # 2022-03-29 21:16:47.838761  datetime 年月日 时分秒
atetime.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

时间差

import datetime
ctime = datetime.datetime.today()
time_tel = datetime.timedelta(hours=1.5)   # days,seconds,microseconds,milliseconds,minutes,hours,weeks
print(ctime)  # 2022-03-29 21:21:40.288855
print(ctime + time_tel)  # 2022-03-29 22:51:40.288855
print(ctime - time_tel)  # 2022-03-29 19:51:40.288855
"""
针对时间计算的公式
    日期对象 = 日期对象 +/- timedelta对象
    timedelta对象 = 日期对象 +/- 日期对象
"""

 

 

 

random模块


random模块又称随机数模块,主要作用就是用来生成随机数。

1.random()---随机产生一个0到1中间的小数

import random
print(random.random())   # 0.33088255948984235

2.uniform()---在一个前闭后开的区间随机产生一个小数

import random
print(random.uniform(2,5))   # 3.4393133327976524

3.randint()---在一个区间里产生一个整数(两边都包含)

import random
print(random.randint(2,5))   # 5

4.shuffle()---随机打乱一个数据集合

import random
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
random.shuffle(l)
print(l)  # [7, 10, 1, 5, 8, 13, 12, 3, 4, 2, 9, 11, 6]

5.choice()---随机抽取一个数据

import random
l = ['一等奖','二等奖','三等奖','安慰奖','特等奖']
print(random.choice(l))  # 一等奖

6.sample()---随机指定个数抽样      

import random
l = ['一等奖','二等奖','三等奖','安慰奖','特等奖']
print(random.sample(l,2))  # ['特等奖', '三等奖']

 

作业

使用random模块编写一个能够产生随机验证码的代码
import random
my_list=[]
my_list.extend(chr(i) for i in range(97,123))
my_list.extend(str(i) for i in range(10))
my_list.extend(chr(i) for i in range(65,91))
# 方法1 sample
def my_random(num):
    res=random.sample(my_list,num)  # 随机抽样的个数
    res2=''
    for i in res:
        res2 += i
    print('验证码为:'+res2)
my_random(5)

# 方法2 choice
def my_random(num):
    res = ''
    for i in range(num):
        res += random.choice(my_list)
    print('验证码为:'+res)
my_random(5)
作业

 

posted @ 2022-03-29 21:14  早安_1207  阅读(63)  评论(0)    收藏  举报
返回顶端