day21 常用模块01
一. 模块
模块是我们把特定功能代码进行归类的结果.
引入模块的方式: 1. import 模块 2. from xxx import 模块
二. collections 集合类的操作, 除了基础数据类型以外的数据集合类型
1. Counter 计数器
s = "I am sylar, I have a dream, freedom...."
dic = {}
for el in s:
dic[el] = dic.setdefault(el, 0) + 1 # get 也可以
print(dic)
from collections import Counter
print(Counter(s)) # 结果是字典类型的
2. deque 双向队列
(重要的数据结构) 1. 栈: FILO 先进后出 -> 砌墙的砖头, 2. 队列: FIFO 先进先出 -> 所有排队的场景
注意: python本身没有提供栈, 但是list本身就是一个栈
# python 写一个栈程序
class StackFullError(Exception): pass # 自定义 栈满的异常
class StackEmptyError(Exception): pass # 自定义 栈空的异常
class Stack:
def __init__(self, size):
self.index = 0 # 栈顶指针
self.lst = []
self.size = size # 栈的容量
# 给栈添加元素
def push(self, item):
if self.index == self.size: # 判断栈顶是否在最后
raise StackFullError('the stack is full') # 抛出异常
self.lst.append(self.index, item) # 根据栈顶指针的位置, 插入对应元素
self.index += 1 # 栈顶指针向下移动
# 从栈中获取(删除)数据
def pop(self):
if self.index is 0: # 判断栈顶指针是否再最上面
raise StackEmptyError('the stack is empty')
self.index -= 1 # z指针向下移动
item = self.lst.pop(self.index) # 获取元素删除
return item # 返回删除的元素, 即可以提取栈内元素
s = Stack(5)
s.push("馒头1号")
s.push("馒头2号")
s.push("馒头3号")
s.push("馒头4号")
s.push("馒头5号")
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
# 队列
import queue
#
q = queue.Queue() # 创建队列
q.put("李嘉诚")
q.put("陈冠希")
q.put("周润发")
q.put("吴彦祖")
print(q.get())
print(q.get())
print(q.get())
print(q.get())
# print(q.get()) # 队列中如果没有元素了. 继续获取的话. 会阻塞
print("拿完了")
from collections import deque
q = deque() # 创建一个双向队列
q.append("高圆圆")
q.append("江疏影")
q.appendleft("赵又廷")
q.appendleft("刘大哥")
# 刘大哥 赵又廷 高圆圆 江疏影
print(q.pop()) # 从右边获取数据
print(q.pop())
print(q.popleft()) # 从左边获取数据
print(q.popleft())
print(q.pop()) # IndexError: pop from an empty deque
# 注意双向队列的左右方向
3. nametuple 命名元组
顾名思义, 给元组内的元素进行命名
from collections import namedtuple
point = namedtuple("Point", ["x", "y", 'z']) # 这个就相当于写了一个类
# class point:
# def __init__(self, x, y):
# self.x = x
# self.y = y
p = point(5, 18, 88)
print(p.x)
print(p.y)
# p.x = 19 # AttributeError: can't set attribute 终归是元组不能修改
print(p)
4. orderdict 和 defaultdict
orderdict 顾名思义, 字典的key是无序的(字典的底层是hash), 而OrderedDict是有序的
dic = {'a':'娃哈哈', 'b':'薯条', 'c':'胡辣汤'}
print(dic) # 最底层一定是无序的. 最底层是hash
from collections import OrderedDict
# 按照我们存储的顺序保存数据
od = OrderedDict({'b':'薯条','a':'娃哈哈', 'c':'胡辣汤'})
print(od)
defaultdict: 可以给字典设置默认值, 当key不存在时, 直接获取默认值
from collections import defaultdict
d = defaultdict(list) # {} # 参数位置给的内容必须是可调用的
d["周杰伦"] = "昆凌"
print(d["周杰伦"]) # 从字典中获取数据的时候. 如果这个key不存在. 去执行可执行的内容, 拿到的是一个空列表
# 以前的题目
lst= [11,22,33,44,55,66,77,88,99]
d = defaultdict(list)
for el in lst:
if el < 66:
d["key1"].append(el) # key1默认是不存在的. 但是可以拿key1. 一个空列表.
else:
d["key2"].append(el)
print(d)
# {'key1': [11, 22, 33, 44, 55], 'key2': [66, 77, 88, 99]})
三. time 时间模块(重点)
1. 获取系统时间 time.time() 得到的结果是是时间戳(timestamp)
时间戳使用的1970年01月01日 00时00分00秒开始的到当前的秒数, 使用float 表示
2. 格式化时间 time.strftime() 常用时间格式: %Y-%m-%d %H:%M:%S
while 1: s = time.strftime("%Y-%m-%d %H:%M:%S") # 使用频率最高 print(s) time.sleep(1) # 一秒一秒的打印时间
3. 结构化时间 time.gmtime() 格林尼治时间 time.localtime() 当地时间
时间表示转换问题
# 从时间戳 -> 格式化时间 t = time.localtime(1542513992) # 有时区问题 gmtime() 格林尼治时间. print(t) str_time = time.strftime("%Y-%m-%d %H:%M:%S", t) print(str_time) # 用户输入一个时间. 变成时间戳 # 格式化时间 -> 时间戳 # 2018-11-18 12:06:32 s = "2018-11-18 12:06:32" t = time.strptime(s, "%Y-%m-%d %H:%M:%S") # string parse time print(t) # 结构化时间 -> 时间戳 ss = time.mktime(t) print(ss) print(time.strftime("%Y年%m月%d日")) # string format time
计算时差问题:
# 时间差 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 模块
五. os 模块
六. sys模块