模块篇:re、collections、time、datetime、random模块

2022.3.29正则补充和部分模块学习

qcPzr9.jpg

  • 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时间比我所在的区域时间早八个小时(时区划分)

q677As.png

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))  # 右边参数指定抽取个数

qciFPK.jpg

作业

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)  # 任意参数都可,表示验证码位数
posted @ 2022-03-29 21:27  马氵寿  阅读(106)  评论(0)    收藏  举报