模块的本质:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
1.模块和包的概念:
模块
随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里。
这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。
在Python中,一个.py文件就称之为一个模块(Module)
包
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。
更多相关内容:http://www.cnblogs.com/Eva-J/articles/7292109.html
二、常用模块(一)
1.collections模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
- namedtuple: 生成可以使用名字来访问元素内容的tuple
- deque: 双端队列,可以快速的从另外一侧追加和推出对象
- Counter: 计数器,主要用来计数
- OrderedDict: 有序字典
- defaultdict: 带有默认值的字典
namedtuple 命名元组
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1,2)
但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
这时,nametuple就派上了用场:nametuple可以为元素的每一个元素名一个名字,这样可以区分元组中的每个元素的意义
from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) # 获得一个命名元组类 p = Point(1, 2) # 为这个类实例化一个对象 p.x 通过名字取值 p.y
tu = namedtuple('ryxiong',['name','age','gender','hobby']) # 获得一个类 t = tu('ryxiong',29,'male', 'programing, prography') # 实例化一个对象 print(t) print(t.name)
deque 双端队列
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
双端队列和列表的区别:
- 效率不同
- 底层的数据结构上,列表先进先出(FIFO),栈先进后出(LIFO)
两者的特点:
- 双端队列:链表式数据结构,存入值速度快
- 列表:取值,根据索引,双端队列要一个一个往下找。
使用场景:
- 从中间插入或者删除比较频繁,使用双端队列
- 单纯的append和pop最后一个元素的时候,用列表。
列表的用法,尽量只用append和pop
from collections import deque d = deque([1,2,3,4]) # 右侧添加 d.append(5) # deque([1, 2, 3, 4, 5]) # print(d) # 左侧添加 d.appendleft(10) # deque([10, 1, 2, 3, 4, 5]) # print(d) # 插入 d.insert(2,99) # deque([10, 1, 99, 2, 3, 4, 5]) # print(d) # 删除 d.remove(3) # 指定元素删除 d.pop() # 不可根据索引删除,因为是双向的
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
OrderedDict 顺序字典
在py3.6版本前,字典中的键是没有顺序的,如果我们要保持key的顺序,可以使用OrderDict:
>>> from collections import OrderedDict >>> d = dict([('a', 1), ('b', 2), ('c', 3)]) >>> d # dict的Key是无序的 {'a': 1, 'c': 3, 'b': 2} >>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) >>> od # OrderedDict的Key是有序的 OrderedDict([('a', 1), ('b', 2), ('c', 3)])
注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
defaultdict 默认字典
# 默认字典 d = defaultdict(list) # defaultdict(<class 'list'>, {}) # print(d) d['name'] # defaultdict(<class 'list'>, {'name': []}) print(d)
有如下值集合 [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]