逆袭之路——python collections、time、datetime、random模块【day20】

今日内容概要

  • re模块补充说明
  • collections模块
  • time模块
  • 时间类型的转换
  • datetime模块
  • random模块
    在这里插入图片描述

今日内容详细

一、re模块补充说明

1、findall的优先级查询

"""
findall默认是分组优先展示
    正则表达式中如果有括号分组 那么在展示匹配结果的时候
    默认只演示括号内正则表达式匹配到的内容!!!
也可以取消分组有限展示的机制
    (?:)  括号前面加问号冒号
"""
import re

ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['www.oldboy.com']

2、search 的索引获取

import re
ret = re.search('a', 'eva jason yuan').group()
print(ret) #结果 : 'a'
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

import re
ret = re.search('a(b)c', 'abcabcabcabc')
print(ret.group())  # abc
print(ret.group(0))  # abc
print(ret.group(1))  # b        可以通过索引的方式单独获取分组内匹配到的数据


'''针对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

3、split 的优先级查询

ret=re.split("\d+","eva3jason4yuan")
print(ret) #结果 : ['eva', 'jason', 'yuan']

ret=re.split("(\d+)","eva3jason4yuan")
print(ret) #结果 : ['eva', '3', 'jason', '4', 'yuan']

#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。

二、collections模块

在这里插入图片描述

1、namedtuple 具名元组

  • 定义:生成可以使用名字来访问元素内容的tuple
  • from collections import namedtuple # 导入模块
  • 格式:namedtuple('名称', [属性list])
  • """具名元组的使用场景也非常的广泛 比如数学领域、娱乐领域等"""
# 1.具名元组
from collections import namedtuple

# 1.先产生一个元组对象模板
# point = namedtuple('坐标',['x','y'])
# 2.创建诸多元组数据
# p1 = point(1,2)
# p2 = point(10,8)
# print(p1,p2)  # 坐标(x=1, y=2) 坐标(x=10, y=8)
# print(p1.x)  # 1
# print(p1.y)  # 2
# person = namedtuple('人物','name age gender')
# p1 = person('jason',18,'male')
# p2 = person('kevin',28,'female')
# print(p1,p2)  # 人物(name='jason', age=18, gender='male') 人物(name='kevin', age=28, gender='female')
# print(p1.name,p1.age)  # jason 18
"""具名元组的使用场景也非常的广泛 比如数学领域、娱乐领域等"""
card = namedtuple('扑克牌', ['花色', '点数'])
c1 = card('黑桃♠', 'A')
c2 = card('黑梅♣', 'K')
c3 = card('红心❤', 'A')
print(c1, c2, c3)
print(c1.点数)

2、deque 双端队列

  • 定义:可以快速的在两端追加和推出对象
  • 队列:先进先出 默认是只有一端只能进另外一端只能出
  • 双端队列:两端都可以进出
  • 使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低,deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
# deque双端队列
from collections import deque  # 导入模块 
a = deque(['a','b','c'])
a.append('x')                  # 默认为末尾添加a 
a.appendleft('y') #            # 左边添加y
print(a)     

需要知道的是:
        deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。

3、字典相关(OrderedDictdefalutdict

  • OrderedDict:有序字典
    Defalutdict:带有默认值的字典
  • 字典内部的key默认是无序的,我们在对字典做迭代时,无法确定key的顺序

如果要保持Key的顺序,可以用OrderedDict:

from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3), ('d', 2)])
print(d.keys())    # dict_keys(['a', 'b','d', 'c'])默认是无序的
ad = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 2)])
print(ad.keys())   # odict_keys(['a', 'b', 'c', 'd'])有序了
"""需要注意的是,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:"""
ad['x'] = 1
ad['y'] = 2
ad['z'] = 3
print(ad.keys()) # odict_keys(['a', 'b', 'c', 'd', 'x', 'y', 'z'])
                # 按照插入的Key的顺序返回
  • 在使用字典时,如果引用的key不存在,就会出现报错,如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
print(dd['key1'])    #键存在  结果是: 'abc'
print(dd['key2'])    #键不存在  结果是:'N/A'

大小存值:

"""
有如下值集合 [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)  # 字典所有的值默认都是列表kv形式,就不需要自己写kv键值对的格式了
for value in values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
print(dict(my_dict))    # {'k2': [11, 22, 33, 44, 55], 'k1': [67, 77, 88, 99, 90]}

4、Counter : 计数器

  • 定义:主要用来记录每一个元素出现的次数
from collections import  Counter
c  = Counter(['a','b','c','c'])
print(c)
 
#结果 Counter({'c': 2, 'a': 1, 'b': 1})

之前学的统计字符串中所有字符出现的次数,要进行循环统计,现在不需要了,用Counter就好

之前所学代码如下:

res = 'abcdeabcdabcaba'
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': 4, 'c': 3, 'd': 2, 'e': 1}

三、time 模块

1、常用方法

1)time.sleep(secs)
        推迟指定的时间运行,单位为秒

2)time.time()
        获取当前时间戳

2、三种用于表示时间的格式

1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

2)格式化时间
这也是人最容易接收的一种时间格式 2000/1/21 11:11:11
time.strftime()

'%Y-%m-%d %H:%M:%S' # 2022-03-29 11:31:30
'%Y-%m-%d %X'  # 2022-03-29 11:31:30

%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)结构化时间
这种时间类型主要是给计算机看的,人看起来不太方便
time.localtime()
在这里插入图片描述

四、 时间类型的转换

几种格式之间的转换
请添加图片描述
请添加图片描述

格式化时间 <==> 结构化时间 <==> 时间戳

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

五、 datetime 模块

date 意思就是年月日
datetime 意思就是年月日 时分秒

1、datetime.now() 获取当前时间

from datetime import datetime
a=datetime.now()
print('当前日期:',a)  # 当前日期: 2022-03-29 19:37:56.485323

2、datetime(2022, 3, 29, 19, 20)用指定日期时间创建时间

from datetime import datetime
#用指定日期创建
c=datetime(2022, 3, 29, 19, 20)
print('指定日期:',c)  # 指定日期: 2022-03-29 19:20:00

3.datetime 时间差

import datetime
ctime = datetime.datetime.today()
time_tel = datetime.timedelta(days=4)
print(ctime)            # 现在时间
print(ctime + time_tel) # 4天后时间
print(ctime - time_tel) # 4天前时间
 
res = ctime + time_tel
print(res - ctime)  # 4 days, 0:00:00

4、字符串转换成 datetime 类型 或 将datetime转换成字符串

  • 用strptime
    在这里插入图片描述
    在这里插入图片描述

用系统时间输出指定字符串

  • datetime.now()

在这里插入图片描述

六、random 模块

  • 也称为随机数模块

1)随机小数

print(random.random())  #  随机产生一个0到1之间的小数
print(random.uniform(2,4))  # 随机产生一个2到4之间的小数
print(random.randint(0,9))  # 随机产生一个0到9之间的整数(包含0和9)

2)随机打乱一个数据集合

  • random.shuffle()
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
random.shuffle(l)  # 随机打乱一个数据集合   类似于洗牌
print(l)

3)随机抽取一个(随机选择一个返回)

  • random.choice()
ll1 = ['特等奖','张飞抱回家','如花','百万现金大奖','群内配对']
print(random.choice(ll1))  # 随机抽取一个  

4)随机指定个数抽取(抽样)

  • random.sample(表名, 个数)
ll = ['如花','C老师','R老师','J老师','M老师','张飞','龙龙']
print(random.sample(ll, 2))  # 随机指定个数抽样     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

絵飛·的魚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值