主要内容:
- 1. 模块的简单认识
- 2. collections模块
- 3. time时间模块
- 4. random模块
- 5. os模块
- 6. sys模块
1. 模块的简单认识
模块: 模块就是我们把装有特定功能的代码进行归类的结果,从代码编写的单位来看我们的程序, 从小到大的顺序:
一条代码 < 语句句块 < 代码块(函数, 类) < 模块. 我们目前写的所有的py文件都是模块.
引入模块的方式:
- 1. import 模块
- 2. from xxx import 模块
在之前的学习中, 我们已经用过了一些基本的模块了. 比如, random, os, sys, collections等等. 那我们目前用到的所有模块都是python内置的模块.不需要额外安装,在后面学习高级框架的内容的时候,可能需要我们自行安装一些第三方提供的模块.
2. collections模块
collections模块主要封装了一些关于集合类的相关操作. 比如, 我们学过的Iterable, Iterator等等.
除了这些以外, collections还提供了一些除了基本数据类型以外的数据集合类型. Counter, deque, OrderDict, defaultdict以及namedtuple
(1)counter counter是一个计数器,主要用来计数
#计算一个字符串中每个字符出现的次数 #以前方法 s = "asdwsadfadahasawwqasdsa" dic ={} for c in s : dic[c] = dic.get(c,0) +1 print(dic) #使用模块 from collections import Counter s = "asdwsadfadahasawwqasdsa" print(Counter(s))
(2)双向队列
引入:两种数据结构 栈&队列
(重点)说双向队列之前我们需要了解两种数据结构
- 栈: FILO. 先进后出 -> 砌墙的砖头, 老师傅做馒头
- 队列: FIFO. 先进先出 -> 买火车票排队, 所有排队的场
手动写一个stack(粗略)模块
# 装馒头的桶
# 1. 入栈
# 2. 出栈
# 属性: 1. 列表(容器) 2.大小(size) 3. 栈顶指针(下一个装元素的位置)
class StackEmptyError(Exception): pass class StackFullError(Exception): pass class Stack: def __init__(self,size): self.index = 0 self.size = size self.lst =[] def push(self,el): if self.index >self.size: raise StackFullError("stack is full") else: self.lst.insert(self.index,el) self.index +=1 def pop(self): if self.index > 0: self.index -= 1 ret = self.lst[self.index] return ret else: raise StackEmptyError("stack is already empty") def clear(self): self.lst.clear() self.index = 0 def __sizeof__(self): return len(self.lst) def max(self): return self.size def now(self): return self.index s = Stack(5) s.push("馒头1") s.push("馒头2") s.push("馒头3") s.push("馒头4") s.push("馒头5") s.push("馒头6") print(s.pop()) print(s.pop()) print(s.pop()) print(s.pop()) print(s.pop()) print(s.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()) # 阻塞了. 在等下一个元素 另外input也有这种机制
关于deque (双向队列)
from _collections import deque d = deque() #创建双向队列 d.append("大话西游") d.append("九品芝麻官") d.append("审死官") d.append("功夫") print(d) #deque(['大话西游', '九品芝麻官', '审死官', '功夫']) d.appendleft("整蛊专家") #从左侧添加 print(d) #deque(['整蛊专家', '大话西游', '九品芝麻官', '审死官', '功夫'])
namedtuple 命名元祖
命名元组, 顾名思义.给元组内的元素进行命名.比如,我们说(x, y) 这是一个元组. 同时我们还可以认为这是一个点坐标. 这时可以使用namedtuple对元素进行命名
from collections import namedtuple #自定义一个元祖,实际是创建了一个类 nt = namedtuple("point",["x","y"]) p = nt(1,2) print(p) #实际是创建了一个类 class Point: def __init__(self,x, y): self.x = x self.y = y p = Point(1, 2)
orderdict 顾名思义.字典的key默认是无序的,而OrderedDict是有序的
from collections import OrderedDict od = OrderedDict({"a":1,"b":2,"c":3}) print(od)
defaultdict: 可以给字典设置默认值. 当key不存在时. 直接获取默认值:
from collections import defaultdict dd = defaultdict(list) #{} list() 必须是callable print (dd["a"]) # 当key不存在的时候. 返回默认值.其实就是callable() dd['b'] = 2 print(dd['b'])
3. time时间模块
import time print(time.time()) # 1538990700.169158 系统时间
此时, 我们已经获取到了系统时间, 但是需要对时间进行格式化. 那这样就引出了另一种时间的格式. 在python中时间分成三种表现形式:
- 时间戳(timestamp):时间戳使用的是从1970年年01月01⽇日 00点00分00秒到现在 一共经过了了多少秒... 使用float来表示
- 格式化时间(strftime): 这个时间可以根据我们的需要对时间进行任意的格式化.
- 结构化时间(struct_time): 这个时间主要可以把时间进行分类划分. 比如.1970 年01月01日 00点00分00秒 这个时间可以被细分为年,月,日.......
(1)对时间进行格式化操作
import time print(time.time()) # 1538991072.1594355 系统时间 s = time.strftime("%Y-%m-%d %H:%M:%S") print(s) # 2018-10-08 17:31:12
****** 日期格式化的标准:******
- %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 当前时区的名称
- %% %号本身
(2)结构化时间
import time print(time.localtime()) #time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=17, tm_min=38, tm_sec=46, tm_wday=0, tm_yday=281, tm_isdst=0)
(3) 时间转化
如果数据库中存储的时间 1888658888.24626
import time t = time.localtime(1888658888.24626) # 结构化时间,将时间戳转化为结构化时间 s = time.strftime("%Y-%m-%d %H:%M:%S",t) #格式化时间 print(s) #2029-11-06 19:28:08
所有的转化都要通过结构化时间来转化.
另外,用户输入一个时间,转化成数据库的时间戳
import time s = "2029-11-06 19:28:08" st = time.strptime(s,"%Y-%m-%d %H:%M:%S") # p:parse 转换 t = time.mktime(st) #转化成时间戳 print(t) #1888658888.0
(4)计算时间差
4. random模块
所有关于随机相关内容都在random模块中
import random print(random.random()) #0-1之间的一个随机的小数 print(random.uniform(1,3)) # 1-3之间的一个随机小数 print(random.randint(1,6)) #1-6之间的一个随机的整数 [1,6] print(random.randrange(1,8,2)) #1-8之间的随机整数 [1,10) print(random.choice([1,"周杰伦",["一路向北","青花瓷","彩虹"]])) print(random.sample([1,"23",[4,5]],2)) #列表元素任意组合两个 lst = [1,2,3,4,5,6,7,8,9] random.shuffle(lst) #随机打乱顺序 print(lst)
5. os模块
os模块是与操作系统交互的一个接口, 所有和操作系统相关的内容都在os模块
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
import os os.makedirs("a/b/c/d") #创建多级目录 os.removedirs("a/b/c/d") # 空目录可以删除. 非空的不能删
- os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
- os.rmdir('dirname') 删除单级空目录,若目录不不为空则无法删除,报错;相当于shell中 rmdir dirname
- os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- os.remove() 删除一个文件
- os.rename("oldname","newname") 重命名文件/目录
- os.stat('path/filename') 获取文件/目录信息
- os.system("bash command") 运行shell命令,直接显示
- os.popen("bash command).read() 运行shell命令,获取执行结果
- os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
# os.path
- os.path.abspath(path) 返回path规范化的绝对路路径
- os.path.split(path) 将path分割成目录和文件名二元组返回
- os.path.dirname(path) 返回path的目录,其实就是os.path.split(path)的第一个元素
- os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素
- os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路路径,返回True
- os.path.isfile(path) 如果path是一个存在的⽂文件,返回True。否则返回False
- os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
- os.path.join(path1[, path2[, ...]]) 将多个路路径组合后返回,第一个绝对路路径之前的参数将被忽略
- os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
- os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小
# 特殊属性:
- os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
- os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" "
- os.pathsep 输出用于分割文件路径的字符串串 win下为;,Linux下为:
- os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix
注意:
os.stat('path/filename') 获取文件/目录信息 的结构说明
# 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)是创建时间(详细信息参见平台的文档)
6. sys模块
sys模块是与python解释器交互的一个接口,所有和python解释器相关的都在sys模块.
- sys.argv 命令行参数List,第⼀一个元素是程序本身路路径
- sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
- sys.version 获取Python解释程序的版本信息
- sys.path 返回模块的搜索路路径,初始化时使用PYTHONPATH环境变量的值
- sys.platform 返回操作系统平台名称
注:异常处理和status
import sys try: sys.exit(1) except SystemExit as e: print(e)