python各种模块

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了'


posted @ 2022-03-29 19:10  洛阳城门听风雨  阅读(52)  评论(0)    收藏  举报