collections 模块
在内置数据类型(dict、list、set、tuple)的基础上,collections 模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple 和 OrderedDict 等
1.namedtuple: 生成可以使用名字来访问元素内容的 tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
namedtuple
我们来看一个坐标轴的例子
#namedtuple from collections import namedtuple Point = namedtuple('point',['x','y','z']) p1 = Point(1,2,3) p2 = Point(3,2,1) print(p1.x) print(p2.z) print(p1,p2)
扑克牌例子,花色与数字
#namedtuple from collections import namedtuple Card = namedtuple('card',['suits','number']) c = Card('红桃',2) print(c.suits) print(c.number) print(c)
deque 双端队列
我们先来看一个队列
#队列 用于 list 很长时,因为删除与插入会变的很慢 import queue q =queue.Queue() #创建一个空队列 q.put(2) #往队列中放值 q.put(5) q.put(7) #print(q.qsize()) #获取数列的大小,在值取完时,大小为 0 print(q.get()) #从队列中取值,一次只取一个 print(q.get()) print(q.get()) #print(q.get()) #当去完时,进入阻塞状态
接着来看下面的双端队列
#使用 list 存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了, #因为 list 是线性存储,数据量大的时候,插入和删除效率很低。 #deque 是为了高效实现插入和删除操作的双向列表,适合用于队列和栈: from collections import deque dq = deque([1,2]) dq.append('a') # 从后面放数据 [1,2,'a'] dq.appendleft('b') # 从前面放数据 ['b',1,2,'a'] dq.insert(2,3) #['b',1,3,2,'a'] print(dq.pop()) # 从后面取数据 print(dq.pop()) # 从后面取数据 print(dq.popleft()) # 从前面取数据 print(dq)
OrderedDict 有序字典
占内存:列表 < 字典 < 有序字典
from collections import OrderedDict od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) # OrderedDict 的 Key 是有序的 print(od['a']) for k in od: print(k) #此时 k 的值就是有序的
defaultdict 默认值的字典
我们直接看例子
#有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。 from collections import defaultdict values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) #这里可以设置默认为 list,在下面就可以少一层关于是否是列表的判断 for value in values: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict)
Counter(没什么用)
Counter 类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为 key,其计数作为 value。计数值可以是任意的 Interger(包括 0 和负数)。Counter 类和其他语言的 bags 或 multisets 很相似
from collections import Counter c = Counter('abcdeabcdabcaba') print(c) #输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
其他详细内容 http://www.cnblogs.com/Eva-J/articles/7291842.html
xml 模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单
time 模块
常用方法
#常用方法 import time time.sleep(secs) #(线程)推迟指定的时间运行。单位为秒。 time.time() #获取当前时间戳
表示时间的三种方式:
分别为:时间戳、元组(struct_time)、格式化的时间字符串
1、时间戳(timestamp) :通常来说,时间戳表示的是从 1970 年 1 月 1 日 00:00:00 开始按秒计算的偏移量。我们运行 “ type(time.time()) ” ,返回的是 float 类型
2、格式化的时间字符串(Format String):‘ 1999-12-06 ’
%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 当前时区的名称 %% %号本身
3、元组(struct_time):struct_time 元组共有9个元素,分别为:(年,月,日,时,分,秒,一年中第几周,一年中第几天,是否是夏令时)
# 索引(Index,属性(Attribute,值(Values) # 0 tm_year(年) 比如2011 # 1 tm_mon(月) 1 - 12 # 2 tm_mday(日) 1 - 31 # 3 tm_hour(时) 0 - 23 # 4 tm_min(分) 0 - 59 # 5 tm_sec(秒) 0 - 60 # 6 tm_wday(weekday) 0 - 6(0表示周一) # 7 tm_yday(一年中的第几天) 1 - 366 # 8 tm_isdst(是否是夏令时) 默认为0
我们来看这三种格式的例子
#导入时间模块 import time #时间戳 time.time() #时间字符串 time.strftime("%Y-%m-%d %X") time.strftime("%Y-%m-%d %H-%M-%S") #时间元组:localtime将一个时间戳转换为当前时区的struct_time time.localtime() time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=13, tm_min=59, tm_sec=37, tm_wday=0, tm_yday=205, tm_isdst=0)
小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的
格式转换
import time # 时间戳和结构化时间 t = time.time() print(t) print(time.localtime(3000000000)) #localtime 时间戳时间转化为结构化时间 print(time.gmtime(t)) print(time.mktime(time.localtime())) #结构化时间转化为时间戳时间 #格式化时间与结构化时间 print(time.strptime('2000-12.31','%Y-%m.%d')) #格式化时间转为结构化时间 print(time.strftime('%m/%d/%Y %H:%M:%S',time.localtime(3000000000))) #结构化时间转为格式化时间
#结构化时间 --> %a %b %d %H:%M:%S %Y串 #time.asctime (结构化时间) 如果不传参数,直接返回当前时间的格式化串 time.asctime(time.localtime(1500000000)) time.asctime() #时间戳 --> %a %b %d %H:%M:%S %Y串 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 time.ctime() time.ctime(1500000000)
random 模块
随机数
import random #随机小数 ran = random.random() # 大于0且小于1之间的小数 ran2 = random.uniform(1,3) #大于1小于3的小数 print(ran,ran2) #比如:发红包 #随机整数 ran3 = random.randint(1,5) # 大于等于1且小于等于5之间的整数 ran4 = random.randrange(1,10,2) # 大于等于1且小于10之间的奇数 print(ran3,ran4)
#随机选择值一个返回 ran5 = random.choice([1,'23',[4,5]]) #1或者23或者[4,5] #随机选择多个返回,返回的个数为函数的第二个参数 ran6 = random.sample([1,'23',[4,5]],2) #列表元素任意2个组合 print(ran5,ran6)
打乱列表顺序
import random item=[1,3,5,7,9] random.shuffle(item) # 打乱次序 print(item) random.shuffle(item) print(item)
os模块
os模块是与操作系统交互的一个接口
#注意:os.stat('path/filename') 获取文件/目录信息 的结构说明 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 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的大小
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)是创建时间(详细信息参见平台的文档)
os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
sys 模块
sys 模块是与 python 解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称
import sys try: sys.exit(1) except SystemExit as e: print(e)
一个简单的例子
#文件名:test.py import sys ret = sys.argv name = ret[1] pwd = ret[2] if name == 'ysg' and pwd == '123': print('登陆成功') else: print("错误的用户名和密码") sys.exit() print('你可以使用计算器了') #执行 python test.py ysg 123
异常处理和 status
import sys try: sys.exit(1) except SystemExit as e: print(e)