python各种模块
re模块补充
findall默认是分组优先展示
正则表达式中如果有括号分组 那么在展示匹配结果的时候
默认只演示括号内正则表达式匹配到的内容!!!
#代码示例:
import re
ret = re.findall('a(b)c', 'abcabcabcabc')
print(ret) # ['b', 'b', 'b', 'b']
也可以取消分组有限展示的机制
(?:) 括号前面加问号冒号
#代码示例:
import re
ret = re.findall('a(?:b)c', 'abcabcabcabc')
print(ret) # ['abc', 'abc', 'abc', 'abc']
'''针对search和match有几个分组 group方法括号内最大就可以取值'''
#分组后可以索引取名:
import re
res1 =re.search('(?P<name1>a)(?P<name2>b)c','abcabcabcabc')
print(res1.group('name1')) # a
print(res1.group('name2')) # b
#可以通过索引的方式单独获取分组内
ret = re.search('a(b)c', 'abcabcabcabc')
print(ret.group()) # abc
print(ret.group(0)) # abc
print(ret.group(1)) # b
' 可以通过索引的方式单独获取分组内匹配到的数据'
collections模块
模块简介
。collections包含了一些特殊的容器,针对Python内置的容器,例如list、dict、set和tuple,提供了另一种选择;
#namedtuple
可以创建包含名称的tuple;
#deque
类似于list的容器,可以快速的在队列头部和尾部添加、删除元素;
#Counter
dict的子类,计算可hash的对象;
#OrderedDict
dict的子类,可以记住元素的添加顺序;
#defaultdict
dict的子类,可以调用提供默认值的函数;
counter:
counter可以支持方便、快速的计数
#代码示例:
from collections import *
res = 'abcdeabcdabcaba'
r = Counter(res)
print(r)
print(r.get('a')) # 可以当成字典使用
#输出结果:
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
deque:
双端队列:两端都可以进出
| append(x) |
将x添加到deque的右侧 |
| appendleft(x) |
将x添加到deque的左侧 |
| clear() |
将deque中的元素全部删除,最后长度为0 |
| count(x) |
返回deque中元素等于x的个数 |
| extend(iterable) |
将可迭代变量iterable中的元素添加至deque的右侧 |
| extendleft(iterable) |
将变量iterable中的元素添加至deque的左侧,往左侧添加序列的顺序与可迭代变量iterable中的元素相反 |
| pop() |
移除和返回deque中最右侧的元素,如果没有元素,将会报出IndexError |
| popleft() |
移除和返回deque中最左侧的元素,如果没有元素,将会报出IndexError |
| remove(value) |
移除第一次出现的value,如果没有找到,报出ValueError |
| reverse() |
反转deque中的元素,并返回None |
| rotate(n) |
从右侧反转n步,如果n为负数,则从左侧反转,d.rotate(1)等于d.appendleft(d.pop()) |
| maxlen |
只读的属性,deque的最大长度,如果无解,就返回None |
#代码示例:
>>> from collections import deque
>>> d = deque('ghi')# 新建一个deque,有三个元素
>>> for ele in d:# 遍历deque
... print ele.upper()
...
...
G
H
I
>>> d.append('j')# deque右侧添加一个元素
>>> d.appendleft('f')# deque左侧添加一个元素
>>> d # 打印deque
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop() # 返回和移除最右侧元素
'j'
>>> d.popleft() # 返回和移除最左侧元素
'f'
>>> list(d)# 以列表形式展示出deque的内容
['g', 'h', 'i']
>>> d[0] # 获取最左侧的元素
'g'
>>> d[-1] # 获取最右侧的元素
'i'
>>> list(reversed(d))# 以列表形式展示出倒序的deque的内容
['i', 'h', 'g']
>>> 'h' in d # 在deque中搜索
True
>>> d.extend('jkl')# 一次添加多个元素
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.rotate(1)# 往右侧翻转
>>> d
deque(['l', 'g', 'h', 'i', 'j', 'k'])
>>> d.rotate(-1)# 往左侧翻转
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> deque(reversed(d))# 以逆序新建一个deque
deque(['l', 'k', 'j', 'i', 'h', 'g'])
>>> d.clear()# 清空deque
>>> d.pop()# 不能在空的deque上pop
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: pop from an empty deque
>>> d.extendleft('abc')# 以输入的逆序向左扩展
>>> d
deque(['c', 'b', 'a'])
namedtuple:
#定义:
命名的元组,意味给元组中的每个位置赋予含义,意味着代码可读性更强,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
from collections import namedtuple
index = namedtuple('个人信息',['name','age','gender'])
p1 = index('jason',18,1500)
p2 = index('tony',28,3000)
print(p1,p2)
#个人信息(name='jason', age=18, gender=1500) 个人信息(name='tony', age=28, gender=3000)
print(p1.name,p2.age) # jason 28
"""具名元组的使用场景也非常的广泛 比如数学领域、娱乐领域等"""
defaultdict:
#定义:
defaultdict是内置数据类型dict的一个子类,基本功能与dict一样,只是重写了一个方法__missing__(key)和增加了一个可写的对象变量default_factory。
#代码示例:
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)
time模块
#定义:
时间间隔是以秒为单位的浮点小数。
每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示
Python 的 time 模块下有很多函数可以转换常见日期格式
# 1.常用方法
1.time.sleep(secs)
推迟指定的时间运行,单位为秒
ps:该方法贯穿前后(基础、后期)
2.time.time()
获取当前时间戳
import time
print(time.time()) # 1648540896.5486045
# 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.格式化时间
人最容易接收的一种时间格式 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 当前时区的名称
%% %号本身
时间类型的转换

格式化时间 <==> 结构化时间 <==> 时间戳
# 时间戳<-->结构化时间
gmtime
localtime
# 结构化时间<-->格式化时间
strftime
strptime
time.strptime("2017-03-16","%Y-%m-%d")
time.strptime("2017/03","%Y/%m")
'前后必须一致'
ps:UTC时间比我所在的区域时间早八个小时(时区划分)
#代码示例1:
import time
localtime = time.asctime(time.localtime(time.time()))
print("本地时间为 :", localtime)
#输出结果:
本地时间为 : Tue Mar 29 16:48:02 2022
#代码示例2:
import time
# 格式化成2022-03-29 16:50:32形式
first = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(first)
# 格式化成Tue Mar 29 16:51:43 2022形式
second = time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
print(second)
# 将格式字符串转换为时间戳
a = "Tue Mar 29 16:51:43 2022"
print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))
# 1648543903.0
Calendar模块
#定义:
此模块的函数都是日历相关的,例如打印某月的字符月历
#代码示例:
import calendar
cal = calendar.month(2022, 4)
print(cal)
#输出结果:
April 2022
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
datetime模块
| 类名 |
功能说明 |
| date |
日期对象,常用的属性有year, month, day |
| time |
时间对象 |
| datetime |
日期时间对象,常用的属性有hour, minute, second, microsecond |
| datetime_CAPI |
日期时间对象C语言接口 |
| timedelta |
时间间隔,即两个时间点之间的长度 |
| tzinfo |
时区信息对象 |
#代码示例:
import datetime
print(datetime.date.today()) # 2022-03-29
print(datetime.datetime.today()) # 2022-03-29 17:08:03.530171
"""
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对象 = 日期对象 +/- 日期对象
#代码示例:
import datetime
ctime = datetime.datetime.today()
time_tel = datetime.timedelta(days=4,hours=10)
# 有很多时间选项
print(ctime) # 2022-03-29 17:17:31.310032
print(ctime + time_tel) # 2022-04-03 03:17:31.310032
print(ctime - time_tel) # 2022-03-25 07:17:31.310032
res = ctime + time_tel
print(res - ctime) # 4 days, 10:00:00
random模块
1.随机取一个整数,使用.randint()方法:
import random
print(random.randint(100000,999999)) #随机取一个整数,顾头顾尾
2.随机取一个小数,使用.uniform()方法:
import random
print(random.uniform(1,900)) #取一个小数,顾头顾尾
#输出结果:510.7275886105975
3.随机取一个元素,使用.choice()方法:
name=['jason','tony','kevin','john','mark','cc']
print(random.choice(name))
4.随机取N个元素,使用.sample()方法:
name=['jason','tony','kevin','john','mark','cc']
print(random.sample(stus,2))#随机取N个元素
5.洗牌,即:打乱顺序,使用.shuffle()方法:
l=list(range(1,101)) #列表中是从1到100的有序list
print(random.shuffle(l)) #结果:None,说明该方法本身没有返回值
print('洗牌之后的',l) #打乱顺序输出
#洗牌这个方法只适用于list
'由于洗牌是直接修改原来的内容 而元组和字符串是不能改变内容的 所以洗牌这个方法只能用于list了'
