模块的本质:一个模块就是一个包含了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等。

  1. namedtuple: 生成可以使用名字来访问元素内容的tuple
  2. deque: 双端队列,可以快速的从另外一侧追加和推出对象
  3. Counter: 计数器,主要用来计数
  4. OrderedDict: 有序字典
  5. 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]
原生字典解决方法

相关文章: