常用模块-01
本节主要内容:
1.模块的简单认识
2.collections模块
3.time时间模块
4.random模块
5.os模块
6.sys模块
一.模块的简单认识
模块:就是我们把装有特定功能的代码进行归类的结果.
引入模块的方式
1.import 模块
2.from xxx import 模块
二.collections模块
collections模块主要封装了一些关于集合类的相关操作.例如:iterable,iterator等等.
1.counter
counter是一个计数器,主要用来计数
计算一个字符串中每个字符出现的次数:
from collections import counter s = "life is a chocolate" ss = counter(s) print(ss) # 结果: # counter({' ': 3, 'l': 2, 'i': 2, 'e': 2, 'a': 2, 'c': 2, 'o': 2, 'f': 1, 's': 1, 'h': 1, 't': 1})
2.deque双向队列
在说双向队列之前我们先了解两种数据结构:
1.栈:filo.它的特点是先进后出
2.队列:fifo.先进先出
由于python中没有给出栈(stack)模块,我们可以粗略写一个栈的模块:
class stackfullerror(exception): pass class stackemptyerror(exception): pass # class stack: def __init__(self,size): self.size = size self.index = 0 self.lst = [] def push(self,el): if self.index == self.size: raise stackfullerror("the stack is full") self.lst.insert(self.index,el) self.index += 1 def pop(self): if self.index == 0: raise stackemptyerror self.index -= 1 c =self.lst.pop(self.index) return c st = stack(3) st.push("早上好") st.push("中午好") st.push("晚上好") print(st.pop()) print(st.pop()) print(st.pop())
队列:python提供了queue模块.使用起来非常方便
import queue q = queue.queue() q.put("刘德华") q.put("张学友") q.put("郭富城") print(q) print(q.get()) print(q.get()) print(q.get()) # print(q.get()) #队列中如果没有元素了,继续获取的话,会阻塞
注意.如果队列里没有元素了.再也就拿不出来元素了,此时程序会阻塞.
双向队列deque,此队列是collections中的.
from collections import deque q = deque() q.append("mandy") q.append("cassie") # 右侧添加 q.appendleft("luis") # 左侧天剑 q.append("hans") print(q.pop()) # 右侧删除 print(q.popleft()) # 左侧删除 print(q.pop()) print(q.popleft())
3.namedtuple 命名元组
命名元组: 给元组内的元素进行命名.
from collections import namedtuple # 定义元组,其实相当于创建了一个类 ppp = namedtuple("hah",["x","y","c"]) p = ppp(1,2,3) print(p) # p.c = 15 # 报错,因为ppp始终是个元组,元组不能进行增删改操作 print(p.y)
4.orderdict 和 defaultdict
orderdict: 字典的key默认是无序的,而orderdict是有序的
dic = {'a':'娃哈哈', 'b':'薯条', 'c':'胡辣汤'} print(dic) from collections import ordereddict od = ordereddict({'a':'娃哈哈', 'b':'薯条', 'c':'胡辣汤'}) print(od)
由于python3.5后的版本打印字典都默认按输入时顺序打印,所以看不出效果.但是内部储存还是无序的,因为字典的key是按hash列表储存的.
defaultdict: 可以给字典设置默认值.当key不存在时.直接获取默认值:
from collections import defaultdict dc = defaultdict(list) # 括号里面的是一个可被调用的对象 print(dc["周星驰"]) # 结果: []
三.time时间模块(重点)
时间模块是一个经常要用到的模块.比如,如何计算时间差,如何按照客户的要求展示时间.等等.
import time print(time.time()) # 1538927647.483177 系统时间
上面获取到的这个时间是一个数字又叫时间戳.
在python中时间分成三种表现形式:
1.时间戳(timestamp). 时间戳使用的是从1970年01月01日 00点00分00秒到现在一共经过了多少秒,使用float来表示.
2.格式化时间(strftime),这个时间可以根据我们的需要对时间进行任意的格式化.
3.结构化时间(struct_time).这个时间可以把主要时间进行分类划分.比如1970年01月01日 00点00分00秒 这个时间可以被细分为年,月,日,星期,等等...
我们一般展示给客户看的时间都是进行格式化后的时间,而不是时间戳.
s = time.strftime("%y-%m-%d %h:%m:%s") # 必须记住 print(s)
# 从时间戳 -> 格式化时间 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
日期格式化的标准:
%y 两位数的年份表示(00-99)
%y 四位数的年份表示(0000-9999)
%m 月份(01-12
%d 月内中的一天(0-31)
%h 24小时制小时数(0-23)
%i 12小时制小时数(01-12)
%m 分钟数(0-59)
%s 秒 (00-59)
%a 本地简化星期名称
%a本地完整星期名称
%b 本地简化的月份名称
%b 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地a.m.或p.m.的等价符
%u 一年中的星期数(00-53)
%w 星期(0-6),星期天为星期的开始
%x 本地相应的日期表示
%x 本地相应的时间表示
%z 当前时区的名称
%% %号本身
结构化时间:
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 # 从时间戳 -> 格式化时间 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日")) # 中文 import locale locale.setlocale(locale.lc_ctype, "chinese")
计算时间差:
第一种算法:
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 ))
关于time模块还需要去看的内容: datetime(时间), calender(日历)
四.random模块
所有关于随机相关的内容都在random模块中.
import random print(random.randint(1,2)) # [start, end] print(random.random()) # (0,1)之间的小数 print(random.uniform(3,10)) # (3, 10 )的随机小数 n = random.randrange(1, 10, 3) # [1, 10) 从奇数中获取到随机数 while n != 10: n = random.randrange(1, 10, 3) for i in range(1, 10, 3): print(i) print(random.choice([1, '周杰伦', ["盖伦", "胡辣汤"]])) # 列表中的任意一个元素 print(random.sample([1, '23', [4, 5]], 2)) # 列表元素任意2个组合 lst = ["周杰伦", "昆凌", "马化腾", "马丽", "沈腾", "秋雅"] random.shuffle(lst) # 随机打乱顺序 print(lst)
五.os模块
所有和操作系统相关的内容都在os模块
import os os.makedirs('dirname1/dirname5') # 创建文件夹目录结构 os.removedirs('dirname1/dirname5') # 删除文件夹, 如果文件夹内没有东西。 就可以删除。 否则报错 os.mkdir('dirname/哈哈') # mkdir如果父级目录不存在。 报错 os.rmdir('dirname') # 删除文件夹 print(os.listdir('../')) # 获取到文件夹内的所有内容. 递归 print(os.stat('dirname')) # linux os.system("dir") # 直接执行命令行程序 s = os.popen("dir").read() print(s) print(os.getcwd() ) # 当前程序所在的文件夹 print(os.path.abspath("../day020 继承") ) # 获取绝对路径 print(os.path.split("d:\python_workspace\day020 继承")) # 拆分路径 ('d:\\python_workspace', 'day020 继承') print(os.path.dirname("d:\python_workspace\day020 继承")) # d:\python_workspace print(os.path.basename("d:\python_workspace\day020 继承")) # day020 继承 print(os.path.exists("dirname")) # 判断文件是否存在 print(os.path.isabs("d:\python_workspace\day020 继承")) # 是否是绝对路径 print(os.path.isfile("01 今日主要内容")) # 是否是文件 print(os.path.isdir("dirname")) # 是否是文件夹 print(os.path.getsize("01 今日主要内容") ) # 文件大小 print("胡辣汤", "传盛", "big", sep="small") print("c:"+os.sep+"胡辣汤") # \\/ 文件路径的分隔符 print(os.name) # nt
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模块:
sys.argv 命令行参数list,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用pythonpath环境变量的值 sys.platform 返回操作系统平台名称
上一篇: utf-8 下汉字为什么需要三个字节
下一篇: 前向传播(张量)- 实战