collections模块、time模块、datetime模块、random模块

今日学习内容总结

      在昨日的学习中,我们了解了正则表达式的使用方法,并且对re模块进行了学习。因为python想要使用正则表达式,就需要借助于re模块。而今天我们对其他模块也来进行学习与使用。

re模块的补充说明

      针对昨日已经学习的re模块常用方法,来做一个补充。

      findall默认是分组优先展示,正则表达式中如果有括号分组,那么在展示匹配结果的时候,默认只演示括号内正则表达式匹配到的内容,同时也可以取消分组有限展示的机制。案例:

  import re

  ret = re.findall('a(b)c', 'abcabcabcabc')
  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')
  print(ret)   # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
  ret = re.findall('(?P<aaa>a)(b)(c)', 'abcabcabcabc')
  print(ret)   # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
  print(ret.group('aaa'))  # 'list' object has no attribute 'group'


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

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


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

collections模块

      collections是日常工作中的重点、高频模块,常用类型有:1.计数器(Counter)。2.双向队列(deque)。3.默认字典(defaultdict)。4.有序字典(OrderedDict)。5.可命名元组(namedtuple)。

1.计数器(Counter)

      Counter作为字典dicit()的一个子类用来进行hashtable计数,将元素进行数量统计,计数后返回一个字典,键值为元素,值为元素个数。

      常用方法

方法名 方法描述
most_common(int) 按照元素出现的次数进行从高到低的排序,返回前int个元素的字典
elements 返回经过计算器Counter后的元素,返回的是一个迭代器
update 和set集合的update一样,对集合进行并集更新
substract 和update类似,只是update是做加法,substract做减法,从另一个集合中减去本集合的元素
iteritems 返回由Counter生成的字典的所有item
iterkeys 返回由Counter生成的字典的所有key
itervalues 返回由Counter生成的字典的所有value

      代码案例

  from collections import Counter

  str = "abcbcaccbbad"
  li = ['a', 'b', 'c', 'a', 'b', 'b']
  d = {'1': 3, '3': 2, '17': 2}

  # Counter获取各元素的个数,返回字典
  print(Counter(str))  # Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
  print(Counter(li))  # Counter({'b': 3, 'a': 2, 'c': 1})
  print( Counter(d))  # Counter({'1': 3, '3': 2, '17': 2})

  # most_common(int)按照元素出现的次数进行从高到低的排序,返回前int个元素的字典
  d1 = Counter(str)
  print(d1.most_common(2))  # [('b', 4), ('c', 4)]

  # elements返回经过计算器Counter后的元素,返回的是一个迭代器
  print(sorted(d1.elements()))  # ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd']
  print( "".join(d1.elements()))  # aaabbbbccccd
  # 若是字典的话返回value个key
  d2 = Counter(d)
  print(sorted(d2.elements()))  # ['1', '1', '1', '17', '17', '3', '3']

2.双向队列(deque)

      队列:先进先出。默认是只有一端只能进另外一端只能出。双端队列:两端都可以进出

      常用方法

方法名 方法描述
append 队列右边添加元素
appendleft 队列左边添加元素
clear 清空队列中的所有元素
count 返回队列中包含value的个数
extend 队列右边扩展,可以是列表、元组或字典,如果是字典则将字典的key加入到deque
extendleft 同extend,在左边扩展
pop 移除并返回队列右边的元素
popleft 移除并返回队列左边的元素
remove(value) 移除队列第一个出现的元素
reverse 队列的所有元素进行反转
rotate(n) 对队列数进行移动

      代码案例

  from collections import deque

  q = deque([1, 2, 3])
  print(q)  # deque([1, 2, 3])
  q.append(444)  # 右边添加元素
  print(q)  # deque([1, 2, 3, 444])
  q.appendleft(666)  # 左边添加元素
  print(q)  # deque([666, 1, 2, 3, 444])
  q.pop()  # 右边弹出元素
  print(q)  # deque([666, 1, 2, 3])
  q.popleft()  # 左边弹出元素
  print(q)  # deque([1, 2, 3])

3.默认字典(defaultdict)

      默认字典,字典的一个子类,继承所有字典的方法,默认字典在进行定义初始化的时候得指定字典值有默认类型。

from collections import defaultdict

dic = defaultdict(dict)

dic["k1"].update({"asdsa": "123"})

print(dic)

# 字典dic在定义的时候就定义好了值为字典类型,虽然现在字典中还没有键值 k1,但仍然可以执行字典的update方法. 这种操作方式在传统的字典类型中是无法实现的,必须赋值以后才能进行值得更新操作,否则会报错。

4.有序字典(OrderedDict)

      有序字典也是字典的一个子类:

      传统方式进行字典排序:

  # 定义传统字典
  dic1 = dict()
  # 按顺序添加字典内容
  dic1['a'] = '123'
  dic1['b'] = 'jjj'
  dic1['c'] = '394'
  dic1['d'] = '999'
  print(dic1)  # 结果: {'a': '123', 'c': '394', 'b': 'jjj', 'd': '999'}
  # 排序
  dic1_key_list = []
  for k in dic1.keys():
      dic1_key_list.append(k)
  dic1_key_list.sort()
  for key in dic1_key_list:
      print('dic1字典排序结果 %s:%s' % (key, dic1[key]))

      使用OrderedDict对字典进行排序:

  from collections import OrderedDict
  # 定义有序字典
  dic2 = OrderedDict()
  dic2['a'] = '123'
  dic2['b'] = 'jjj'
  dic2['c'] = 'abc'
  dic2['d'] = '999'

  print(dic2)  # OrderedDict([('a', '123'), ('b', 'jjj'), ('c', 'abc'), ('d', '999')])
  print(dic2.keys())  # odict_keys(['a', 'b', 'c', 'd'])

5.可命名元祖(namedtuple)

      namedtuple由自己的类工厂namedtuple()进行创建,而不是由表中的元组进行初始化,通过namedtuple创建类的参数包括类名称和一个包含元素名称的字符串。

      方法示例:

from collections import namedtuple

p = namedtuple("person", "name,age,sex")
print(type(p))  # <class 'type'>

zhanglin = p("zhanglin", 30, "male")
print(zhanglin)  # person(name='zhanglin', age=30, sex='male')
print(zhanglin.name, zhanglin.age)  # zhanglin 30

time模块

      在Python中,与时间处理相关的模块有:time、datetime以及calendar。学会计算时间,对程序的调优非常重要,可以在程序中狂打时间戳,来具体判断程序中哪一块耗时最多,从而找到程序调优的重心处。

      常用方法:1.time.sleep(secs)。推迟指定的时间运行,单位为秒。2.time.time()。获取当前时间戳。

      三种用于表示时间的格式(彼此之间可以转换):

时间戳

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

结构化时间

      该时间类型主要是给计算机看的,人看起来不太方便。写法:time.localtime()。

索引值(Index) 属性(Attribute) 值(Values)
0 tm_year(年) (例如:2015)
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(星期几) 0 ~ 6(0 表示星期一)
7 tm_yday(一年中的第几天) 1 ~ 366
8 tm_isdst(是否为夏令时) 0, 1, -1(-1 代表夏令时)默认为0

      值得注意的是,索引值为5的tm_sec(秒)的值得范围是可以为0~61的。60 代表闰秒,61 是基于历史原因保留。但是一般不会产生这种情况,了解一下就可以了。

格式化时间

      人最容易接收的一种时间格式,比如:2000/1/21 or 11:11:11 写法:time.strftime()

格式 含义
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24 小时制,00 - 23
%l 一天中的第几个小时(12 小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%m 月份(01 - 12)
%M 分钟数(00 - 59)
%p 本地 am 或者 pm 的相应符
%S 秒(01 - 61)
%U 一年中的星期数(00 - 53 星期天是一个星期的开始)第一个星期天之前的所有天数都放在第 0 周
%w 一个星期中的第几天(0 - 6,0 是星期天)
%W 和 %U 基本相同,不同的是 %W 以星期一为一个星期的开始
%x 本地相应日期
%X 本地相应时间
%y 去掉世纪的年份(00 - 99)
%Y 完整的年份
%z 用 +HHMM 或 -HHMM 表示距离格林威治的时区偏移(H 代表十进制的小时数,M 代表十进制的分钟数)
%Z 时区的名字(如果不存在为空字符)
%% %号本身

时间类型的转换

**时间格式转换图:

      时间戳与结构化时间的转换

  # gmtime
  # localtime
  print(time.localtime(1648551245.638347))  # 将时间戳转化为结构化时间
  # time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=18, tm_min=54, tm_sec=5, tm_wday=1, tm_yday=88, tm_isdst=0)

  # 使用gmtime结果一样,效果相同的

      结构化时间与格式化时间的转换

import time
  # strftime
  print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 将结构化时间转化为格式化时间  2022-03-29 18:57:23
  # strptime
  print(time.strptime('2022-03-29 18:57:23', '%Y-%m-%d %X'))  # 将格式化时间转化为结构化时间
  # time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=18, tm_min=57, tm_sec=23, tm_wday=1, tm_yday=88, tm_isdst=-1)

datetime模块

      datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化输出。

      基本操作:

  import datetime
  print(datetime.date.today())  # 2022-03-29
  print(datetime.datetime.today())  # 2022-03-29 19:01:35.054007
  '''
  date                意思就是年月日
  datetime            意思就是年月日 时分秒
  # 后期很多时间相关的操作都是跟date和time有关系
  '''
  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

  ctime = datetime.datetime.today()
  time_tel = datetime.timedelta(days=4)   # 有很多时间选项
  print(ctime)  # 2022-03-29 19:06:12.752012
  print(ctime + time_tel)  # 2022-03-29 19:06:12.752012
  print(ctime - time_tel)  # 2022-03-29 19:06:12.752012

  res = ctime + time_tel
  print(res - ctime)  # 4 days, 0:00:00
  # 这是一个针对时间计算的公式:日期对象 = 日期对象 +/- timedelta对象

random模块

     Python中的random模块用于生成随机数。

     random模块的功能

1.random.random()

     用于生成一个0到1的随机浮点数:0<= n < 1.0

  import random

  print(random.random())  # 0.6475660665971071  随机产生

2.random.uniform(a,b)

     用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: b <= n <= a。如果 a <b, 则 a <= n <= b。

  import random

  print(random.uniform(2, 4))  # 3.8782705354832148

3.random.randint(a, b)

     用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

  import random

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

4.random.choice(sequence)

     random.choice从序列中获取一个随机元素。其函数原型为:random.choice(sequence)。

  import random

  a = ['Jason', 'handsome', 'nb', '666']
  print(random.choice(a))  # handsome 随机抽取一个

5.random.sample(sequence, k)

     从指定序列中随机获取指定长度的片断并随机排列。注意:sample函数不会修改原有序列。

  import random

  a = ['Jason', 'handsome', 'nb', '666']
  print(random.sample(a, 3))  # ['handsome', '666', 'Jason']  随机指定个数抽样

posted @ 2022-03-29 19:40  くうはくの白  阅读(74)  评论(0)    收藏  举报