Python_常用模块
模块
什么是模块:
一个模块就是一个包含了 python 定义和声明的文件,文件名就是模块名加上.py的后缀。
但其实 import 加载的模块分为四个通用类别:
1、使用 python 编写的代码(.py文件)
2、已被编译为共享库或 DLL 的 C 或 C++ 扩展
3、包好一组模块的包
4、使用 C 编写并链接到 python 解释器的内置模块
为何要使用模块:
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用。
常用模块
collections 模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1、namedtuple: 生成可以使用名字来访问元素内容的tuple
2、deque: 双端队列,可以快速的从另外一侧追加和推出对象
3、Counter: 计数器,主要用来计数
4、OrderedDict: 有序字典
5、defaultdict: 带有默认值的字典
namedtuple:
from collections import namedtuple Point = namedtuple('Point', ['x', 'y', 'z']) p1 = Point(1, 2, 3) p2 = Point('a', 'b', 'c') print(p1.x) print(p1.y) print(p1.z) print(p1.x, p1.y) print(p1.x, p1.y, p1.z) print(p1, p2) 1 2 3 1 2 1 2 3 Point(x=1, y=2, z=3) Point(x='a', y='b', z='c')
deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
import queue q = queue.Queue() q.put('x') q.put([1, 2, 3]) q.put(5) q.put(6) q.put(7) print(q) print(q.get()) print(q.get()) print(q.get()) print(q.get()) # 阻塞 print(q.qsize()) x [1, 2, 3] 5 6 1
from collections import deque deq = deque([1, 2]) # [1, 2] deq.append('a') # [1, 2, 'a'] deq.appendleft('b') # ['b', 1, 2, 'a'] deq.insert(1, 5) # ['b', 5, 1, 2, 'a'] print(deq.pop()) print(deq.pop()) print(deq.popleft()) print(deq) a 2 b deque([5, 1])
OrderedDict
使用 dict 时,key 是无序的。在对 dict 做迭代时,我们无法确定 key 的顺序。
如果要保持 key 的顺序,可以用 OrderedDict:
from collections import OrderedDict od = OrderedDict([['b', 2], ['a', 1], ['c', 3]]) # od = OrderedDict([('b', 2), ('a', 1), ('c', 3)]) # 效果一样 print(od) print(od['a']) for k in od: print(k) OrderedDict([('b', 2), ('a', 1), ('c', 3)]) 1 b a c
defaultdict
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}
values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = {} for value in values: if value>66: if my_dict.has_key('k1'): my_dict['k1'].append(value) else: my_dict['k1'] = [value] else: if my_dict.has_key('k2'): my_dict['k2'].append(value) else: my_dict['k2'] = [value]
from collections import defaultdict values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = defaultdict(list) for value in values: if value > 66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' dd['key2'] # key2不存在,返回默认值 print(dd) defaultdict(<function <lambda> at 0x0000000001080BF8>, {'key2': 'N/A', 'key1': 'abc'})
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})
时间模块
常用方法:
1.time.sleep(secs) (线程)推迟指定的时间运行。单位为秒。 2.time.time() 获取当前时间戳
表示时间的三种方法
在Python中,通常有这三种方式来表示时间:时间戳、元组(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 |
导入time模块,python中表示时间的几种格式:
import time # 时间戳 print(time.time()) # 时间字符串 print(time.strftime('%Y-%m-%d %X')) print(time.strftime('%Y-%m-%d %H-%M-%S')) # 时间元组:localtime将一个时间戳转换为当前时区的 struct_time print(time.localtime()) 1515584319.132047 2018-01-10 19:38:39 2018-01-10 19-38-39 time.struct_time(tm_year=2018, tm_mon=1, tm_mday=10,
tm_hour=19, tm_min=38, tm_sec=39,
tm_wday=2, tm_yday=10, tm_isdst=0)
时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的
几种格式之间的转换

时间戳(timestamp)---> 结构化时间(struct time)
浙公网安备 33010602011771号