常用模块(collections,time,sys)
collections
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等
namedtuple 可命名元组
from collections import namedtuple # 可命名元组 P = namedtuple('point',['x','y']) p = P(1,2) print(p) # point(x=1, y=2) print(p.x) # 1 print(p.y) # 2 # 描述一类东西的时候,这一类东西都有相同的特征,想直接用特征的名字就描述这个值的时候就可以用可命名元组
队列:一种数据结构,先进先出
FIFO:FIRST IN FIRST OUT
import queue # 队列_多线程多进程 处理任务 q = queue.Queue() # 创建了一个队列q q.put(1) # 往里放值 q.put(2) q.put(300) q.put('aaa') q.put('wahaha') print(q.qsize()) # 5 查看当前队列有多大 print(q.get()) # 1 往外拿值 print(q.get()) print(q.get()) print(q.get()) print(q.get()) # print(q.get()) # 拿完了会等着 q.get_nowait()不等,拿完会报错
deque 双端队列
from collections import deque # 双端队列 dq = deque() dq.append('a') print(dq) # deque(['a']) dq.append('b') dq.appendleft('c') print(dq) # deque(['c', 'a', 'b']) print(dq.pop()) # b print(dq.popleft()) # c
OrderedDict 有序字典
from collections import OrderedDict # 有序字典 od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) for k in od: print(k,od[k])
defaultdict 默认字典
from collections import defaultdict my_dict = defaultdict(list) # 给字典的value设置一个默认值,默认值必须是可调用的 print(my_dict['k']) # [] 当key不存在时,不报错,会返回设置的默认值 dd = defaultdict(lambda: 'N/A') # 默认值必须是可调用的callable dd['key1'] = 'abc' print(dd['key1']) # key1存在 'abc' print(dd['key2']) # key2不存在,返回默认值 'N/A'
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})
time时间模块
和时间有关系的我们就要用到时间模块。在使用模块之前,应该首先导入这个模块
import time
time.sleep(1) # 睡1秒
表示时间的三种格式
在Python中,通常有这三种方式来表示时间:时间戳、结构化时间元组(struct_time)、格式化的时间字符串
时间戳
时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型
time.time() # 1500875844.800804
格式化的时间字符串
格式化的时间字符串(Format String): ‘1999-12-06’
time.strftime("%Y-%m-%d %X") # string format time '2017-07-24 13:54:37' time.strftime("%Y-%m-%d %H-%M-%S") '2017-07-24 13-55-04' # %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 当前时区的名称 # %% %号本身
结构化时间元组
元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
# 时间元组:localtime将一个时间戳转换为当前时区的struct_time time.localtime() # 本地时间 time.gmtime() # 伦敦时间 # 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)
几种时间格式之间的转换
ret = time.localtime(1000000000) # localtime 时间戳转换为结构化时间 print(ret) print(time.mktime(ret)) # mktime 结构化时间转换为时间戳 ret2 = time.strftime('%Y-%m-%d %a %X',ret) # strftime 结构化时间转换字符串时间 print(ret2) time.strptime('1990-3-31','%Y-%m-%d') # 字符串时间转换结构化时间 print(time.asctime()) # Tue Nov 14 12:22:53 2017 括号内可以放结构化时间 time.ctime(1000000) # 将时间戳转换为上面的格式
计算时间差例子
start_time = 1500000000 now = time.time() struct_time = time.gmtime(now -start_time) # 将时间转换为伦敦时间后计算 print(struct_time.tm_year - 1970) print(struct_time.tm_mon - 1) print(struct_time.tm_mday - 1)
sys模块
sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
import sys print(sys.platform) # win32 操作系统平台名称
print(sys.version) # python解释器的版本
# sys.exit() 直接退出程序
print(sys.path) # sys.path就是模块导入的时候从这个列表中的路径依次去寻找模块 # 找到了就停止 # sys.path的第一位元素是当前被执行的python文件所在的地址 # 之后的地址依次是python内部的库 # sys.argv 以列表的形式接收参数,第一个元素为执行的文件名 print(sys.argv) # python 6sys.py # python 6sys.py alex 3714 args_lst = sys.argv # ['6sys.py','alex','3714'] if len(args_lst) == 3 and args_lst[1] == 'alex' and args_lst[2] == '3714': print('执行程序了') else: sys.exit() # sys.argv 的第一个值是固定的,就是这个文件的名字 # 之后的参数实在控制台执行py文件的时候传入的参数 # 我们可以用这些参数来直接完成一些校验类的工作