Java教程

模块知识

本文主要是介绍模块知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

内容概要

  • re模块与正则其他知识
  • collctions模块
  • time模块
  • datetime模块
  • random模块

 


re模块与正则其他知识

分组优先

在我们使用括号给正则表达式分组时会出现只展示括号里的表达式筛选的结果
    "以下只展示括号里筛选的结果"
    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')]

    '''
    findall默认是分组优先展示
        正则表达式中如果有括号分组 那么在展示匹配结果的时候
        默认只演示括号内正则表达式匹配到的内容!!!
    '''

取消分组优先

当我们不想筛选结果分组优先展示时,可以用其他办法取消分组优先
    '''通过在括号里用(?:)来取消分组优先展示'''

    ret = re.findall('(?:a)bc', 'abcabcabcabc')
    print(ret)  # ['abc', 'abc', 'abc', 'abc']
    
    '''findall不能通过.group()分组'''

group括号内的值

    # 一个分组
    ret = re.search('ab(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    可以通过索引的方式单独获取分组内匹配到的数据
    
    '''可以看出有几个分组group内的的值最大的数就多少,不写时默认为0'''

分组后起别名

    '''这里得分组指的是能支持group的才可以如search match ; findall不行会报错'''

    # 分组起别名后可直接拿别名来使用
    ret = re.search('a(?P<name1>b)(?P<name2>c)', 'abcabcabcabc')
    print(ret.group('name1'))  # b
    print(ret.group('name2'))  # c
    

collections模块

collections可以给我们提供除python内置数据类型外更多的额外的数据类型

具名元组namedtuple

    # 具名元组顾名思义是具有名字的元组
    """具名元组的使用场景也非常的广泛 比如数学领域、娱乐领域等"""
    from collections import namedtuple  # 导入模块

    # 产生一个元组对象模板
    card = namedtuple('扑克牌', ['花色', '点数'])
    # 创建多个元组数据
    c1 = card('黑桃♠', 'A')
    c2 = card('黑梅♣', 'K')
    c3 = card('红心❤', 'A')
    print(c1, c2, c3)
    print(c1.点数)

双端队列

    '''
      队列:默认先进先出一端进一端出
      双端队列:两端都可以进出
    '''
      "队列"
      import queue

      q = queue.Queue(3)  # 最大只能放三个元素
      #存放元素
      q.put(123)
      q.put(321)
      q.put(222)
      q.put(444)  # 如果队列满了 继续添加则原地等待
        # 获取元素
      print(q.get())  # 123
      print(q.get())  # 321
      print(q.get())  # 222
      print(q.get())  # 如果队列空了 继续获取则原地等待

      "双端队列"
      from collections import deque

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

字典相关

    # 有序字典
    from collections import OrderedDict

    d2 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    print(d2)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    d2['e'] = 111
    d2['b'] = 222
    d2['c'] = 333
    print(d2)  # OrderedDict([('a', 1), ('b', 222), ('c', 333), ('e', 111)])
    print(d2.keys())  # odict_keys(['a', 'b', 'c', 'e'])


    """字典的所有默认值都为列表 {'':[],'':[]}"""
    """
    有如下值集合 [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)
    print(my_dict)  # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [67, 77, 88, 99, 90]})     

计数器Counter

res = 'abcdeabcdabcaba'
    '''
    统计字符串中所有字符出现的次数
        {'a':3,'b':5...}
    '''
    # 自己写的方法
    # 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}
    
    "使用counter计数器模块"
    from collections import Counter

    r = Counter(res)
    print(r)  # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
    print(r.get('a'))  # 可以当成字典使用

 

time模块

时间戳 timestamp

    # 1.常用方法
    1.time.sleep(secs)
    	推迟指定的时间运行,单位为秒
      	ps:该方法贯穿前后(基础、后期)

    2.time.time()
    	获取当前时间戳   
    t = time.time()
    print(t)  # 1648530221.6222584
    '''时间戳 从1970年1月1日0时0分0秒至今的秒数'''

结构化时间 struct_time

    # struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
    # 时间元组:localtime将一个时间戳转换为当前时区的struct_time
    tp = time.localtime()
    print(tp)
    # time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=12, tm_min=54, tm_sec=15, tm_wday=1, tm_yday=88, tm_isdst=0)

结构化时间符号信息表

元素符号 表示信息 元素符号 表示信息
tm_year (年) 比如2011 tm_min (分)0 - 59
tm_mon (月)1 - 12 tm_sec (秒)0 - 60
tm_mday (日) 1 - 31 tm_wday (weekday)0 - 6(0表示周一)
tm_hour (时)0 - 23 tm_yday (一年中的第几天)1 - 366
tm_isdst (是否是夏令时)默认为0

格式化时间 Format String

    # t1 = time.strftime('%Y-%m-%d %H:%M:%S')  # 固定格式
    t1 = time.strftime('%Y-%m-%d %X')  # 简写 当后边的不记得时可以用%X
    print(t1)  # 2022-03-29 13:03:41

格式化时间符号信息表

元素符号 表示信息 元素符号 表示信息
%y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999)
%m 月份(01-12) %M 分钟数(00=59)
%d 月内中的一天(0-31) %S 秒(00-59)
%H 24小时制小时数(0-23) %I 12小时制小时数(01-12)
%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时间比我所在的区域时间早八个小时(时区划分)

 

datetime模块

    # 基本操作
    import datetime
    # print(datetime.date.today())  # 2022-03-29
    # print(datetime.datetime.today())  # 2022-03-29 11:55:50.883392
    """
    date                意思就是年月日
    datetime            意思就是年月日 时分秒
    ps:后期很多时间相关的操作都是跟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 12:01:52.279025
    # print(ctime + time_tel)  # 2022-04-02 12:01:52.279025
    # print(ctime - time_tel)  # 2022-03-25 12:03:34.495813
    """
    针对时间计算的公式
        日期对象 = 日期对象 +/- timedelta对象
        timedelta对象 = 日期对象 +/- 日期对象
    """
    res = ctime + time_tel
    print(res - ctime)  # 4 days, 0:00:00

random模块

random模块也被称为随机数模块
    import random

    # 随机产生一个0到1之间的小数
    print(random.random())  # 0.2791171516078955

    # 随机产生一个2到4之间的小数
    print(random.uniform(2,4))   # 3.462177394295104

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

    # 掷骰子
    print(random.randint(1,6))  # 3
    
    # 随机打乱顺序  洗牌
    l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    random.shuffle(l)  # 随机打乱一个数据集合                       
    print(l)  # [8, 9, 6, 10, 1, 7, 3, 2, 5, 4]
    
    # 抽奖
    l1 = ['一等奖', '二等奖', '三等奖', '谢谢惠顾']
    # 随机抽取一个
    print(random.choice(l1))  # 谢谢惠顾

    # 随机抽取指定个数
    print(random.sample(l1,3))  # ['二等奖', '三等奖', '谢谢惠顾']

这篇关于模块知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!