• Day-20 基础模块1


    一、collections模块

      collections模块主要封装了一些关于集合类的相关操作

      1.Counter

        counter是一个计数器,主要用来计数

    low:
    
    s = "alex like pig"
    
    dic = {}
    for c in s:
        dic[c] = dic.get(c, 0) + 1
    print(dic)
    
    nb:
    s = "alex like pig"
    print(Counter(s)) # 获取到的结果可以像字典一样进行使用 [key]

      2.deque 双向队列

        (重点)说双向队列之前我们需要了解两种数据结构. 1. 栈, 2. 队列
        1. 栈: FILO. 先进后出 -> 砌墙的砖头, 老师傅做馒头
        2. 队列: FIFO. 先进先出 -> 买火车票排队, 所有排队的场景

      栈:由于python没有给出Stack模块,所以我们自己手动写一个粗略版本(注意:此版本存在严重的高并发问题)

     1 class StackEmptyError(Exception):
     2     pass
     3 
     4 class StackFullError(Exception):
     5     pass
     6 
     7 class Stack:
     8     def __init__(self, size):
     9         self.index = 0
    10         self.size = size
    11         self.lst = []
    12  
    13     def pop(self):
    14         if self.index > 0:
    15             ret = self.lst[self.index]
    16             return ret
    17         else:
    18             raise StackEmptyError("stack has already empty")
    19  
    20     def push(self, el):
    21         if self.index > self.size:
    22             raise StackFullError("stack is full")
    23         else:
    24             self.lst[self.index] = el
    25             self.index = self.index + 1
    26  
    27     def clear(self):
    28         self.lst.clear()
    29         self.index = 0
    30  
    31     def __sizeof__(self):
    32         return len(self.lst)
    33  
    34     def max(self):
    35         return self.size
    36  
    37     def now(self):
    38         return self.index 
    Stack栈

      队列:python提供了queue模块,使用起来非常方便

    1 import queue
    2 q = queue.Queue()
    3 q.put("李嘉诚")
    4 q.put("张开")
    5 q.put("张毅")
    6 print(q)
    7 print(q.get())
    8 print(q.get())
    9 print(q.get())
    queue队列

      注意. 如果队列里没有元素了. 再也就拿不出来元素了. 此时程序会阻塞. 

      接下来,我们看一下deque,注意,此队列是collections中的。

     1 from collections import deque
     2 
     3 q = deque()
     4 q.append("张开") # 右侧添加
     5 q.append("包贝尔")
     6 q.appendleft("赵又廷") # 左侧添加
     7 q.appendleft("还我高圆圆")
     8 print(q)
     9 
    10 print(q.pop()) # 右侧删除
    11 print(q.popleft()) # 左侧删除
    双向队列deque

      3.namedtuple 命名元组    

        命名元组, 顾名思义. 给元组内的元素进行命名. 比如. 我们说(x, y) 这是一个元组. 同时. 我们还可以认为这是一个点坐标. 这时, 我们就可以使用namedtuple对元素进行命名

    1 from collections import namedtuple
    2 
    3 # 自己定义了一个元组, 如果灵性够好, 这其实就是创建了一个类
    4 nt = namedtuple("point", ["x", "y"])
    5 p = nt(1, 2)
    6 print(p)
    7 
    8 print(p.x)
    9 print(p.y)
    namedtuple命名元组

      4.orderdict和defaultdict

        orderdict 顾名思义,字典的key默认是无序的,而OrderedDict是有序的

    1 dic = {'a':'娃哈哈', 'b':'薯条', 'c':'胡辣汤'}
    2 print(dic)
    3 
    4 from collections import OrderedDict
    5 od = OrderedDict({'a':'娃哈哈', 'b':'薯条', 'c':'胡辣汤'})
    6 print(od)
    orderdict

        defaultdict 可以给字典设置默认值,当key不存在时,直接获取默认值:

    1 from collections import defaultdict
    2 
    3 dd = defaultdict(list) # 默认值list
    4 print(dd['娃哈哈']) # [] 当key不存在的时候. 会自动执行构造方法中传递的内容. 
    defaultdict

    二、time时间模块

      日期格式化的标准:

    %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 当前时区的名称
    %% %号本身
    日期格式化的标准

     

    import time
    print(time.time()) # 1538927647.483177 系统时间
    
    
    s = time.strftime("%Y-%m-%d %H:%M:%S") # 必须记住
    print(s)
    
    
    #结构化时间
    print(time.localtime())
    结果:
    time.struct_time(tm_year=2017, tm_mon=05, tm_mday=8, tm_hour=10, tm_min=24,
    tm_sec=42, tm_wday=0, tm_yday=126, tm_isdst=0)  

      好了. 先在看到的都是当前系统时间, 那如果碰到时间转换呢? 比如. 我们的数据库中存储了这样一个时间: 1888888888. 如何显示成xxxx年xx月xx日. 那时间的转化必须要记住: 所有的转化都要通过结构化时间来转化.

    t = time.localtime(1888888888) # 结构化时间
    s = time.strftime("%Y-%m-%d %H:%M:%S", t) # 格式化这个时间
    print(s)

      那如果说, 我让用户输入一个时间, 怎么把它转化成我们数据库存储的时间戳呢? 还是要用到结构化时间

    s = "2020-10-01 12:18:12"
    t = time.strptime(s, "%Y-%m-%d %H:%M:%S") # 转化成结构时间
    print(time.mktime(t)) # 转换成时间戳

      以上两段代码,必须记住

      计算时间差:

      第一种:

    时间差  1小时30分
    begin = "2018-11-14 16:30:00"
    end = "2018-11-14 18:00:00"
    # 用时间戳计算出时间差(秒)
    begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S")
    end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S")
    
    begin_second = time.mktime(begin_struct_time)
    end_second = time.mktime(end_stract_time)
    
    # 秒级的时间差   180000
    diff_time_sec = abs(begin_second - end_second)
    
    # 转换成分钟
    diff_min = int(diff_time_sec//60)
    print(diff_min)
    
    diff_hour = diff_min//60  # 1
    diff_min_1 = diff_min % 60 # 30
    
    print("时间差是 %s小时%s分钟" % (diff_hour, diff_min_1))

      第二种:

    begin = "2019-11-14 16:30:00"
    end = "2018-11-14 18:00:00"
    # 用时间戳计算出时间差(秒)
    begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S")
    end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S")
    
    begin_second = time.mktime(begin_struct_time)
    end_second = time.mktime(end_stract_time)
    
    # 秒级的时间差  180000
    diff_time_sec = abs(begin_second - end_second)
    
    # 转化成结构化时间
    t = time.gmtime(diff_time_sec) # 最好用格林尼治时间。 否则有时差
    print(t)
    
    print("时间差是%s年%s月 %s天 %s小时%s分钟" % (t.tm_year-1970, t.tm_mon-1, t.tm_mday-1,t.tm_hour, t.tm_min ))

    三、random模块

      所有关于随机相关的内容都在random模块中

    import random
    
    print(random.random()) # 0-1小数
    print(random.uniform(3, 10)) # 3-10小数
    
    print(random.randint(1, 10)) # 1-10整数 [1, 10]
    print(random.randrange(1, 10, 2)) # 1-10奇数 [1,10)
    
    print(random.choice([1, '周杰伦', ["盖伦", "胡辣汤"]])) # 1或者23或者[4,5])
    print(random.sample([1, '23', [4, 5]], 2)) # 列表元素任意2个组合
    
    lst = [1, 2, 3, 4, 5, 6, 7, 8]
    random.shuffle(lst) # 随机打乱顺序
    print(lst)

    四、os模块

      os.stat()属性解读:

    stat 结构:
    
    st_mode: inode 保护模式
    st_ino: inode 节点号。
    st_dev: inode 驻留的设备。
    st_nlink: inode 的链接数。
    st_uid: 所有者的用户ID。
    st_gid: 所有者的组ID。
    st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
    st_atime: 上次访问的时间。
    st_mtime: 最后一次修改的时间。
    st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

    五、sys模块

       所有和python解释器相关的都在sys模块

  • 相关阅读:
    STM32的CRC32 软件实现代码
    AES CBC/CTR 加解密原理
    Either, neither, both
    Answer Sheet
    Both
    How to convert a byte to its binary string representation
    how convert large HEX string to binary array ?
    TEA -- Tiny Encryption Algorithm
    DES
    IAR EWARM Checksum Technical Note
  • 原文地址:https://www.cnblogs.com/minusone/p/9960109.html
Copyright © 2020-2023  润新知