1. 程式人生 > >常見模塊和包

常見模塊和包

2-2 默認值 內容 之前 為什麽 clas hgj tcl 隊列

1什麽是模塊?

常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。

但其實import加載的模塊分為四個通用類別: 

  1 使用python編寫的代碼(.py文件)

  2 已被編譯為共享庫或DLL的C或C++擴展

  3 包好一組模塊的包

  4 使用C編寫並鏈接到python解釋器的內置模塊

2 為什麽要使用模塊?

如果你退出python解釋器然後重新進入,那麽你之前定義的函數或者變量都將丟失,因此我們通常將程序寫到文件中以便永久保存下來,需要時就通過python test.py方式去執行,此時test.py被稱為腳本script。 隨著程序的發展,功能越來越多,為了方便管理,我們通常將程序分成一個個的文件,這樣做程序的結構更清晰,方便管理。這時我們不僅僅可以把這些文件當做腳本去執行,還可以把他們當做模塊來導入到其他的模塊中,實現了功能的重復利用

3常見模塊?

一collection

在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1.namedtuple: 生成可以使用名字來訪問元素內容的tuple

們知道tuple可以表示不變集合,例如,一個點的二維坐標就可以表示成:

>>> p = (1, 2)

但是,看到(1, 2),很難看出這個tuple是用來表示一個坐標的。

這時,namedtuple就派上了用場:

>>> from collections import namedtuple
>>> Point = namedtuple(Point‘, [x‘, y])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple定義:

#namedtuple(‘名稱‘, [屬性list]):
Circle = namedtuple(Circle‘, [x‘, y‘, r‘])

2.deque: 雙端隊列,可以快速的從另外一側追加和推出對象

使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數據量大的時候,插入和刪除效率很低。

deque是為了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧:

>>> from collections import deque
>>> q = deque([a‘, b‘, c])
>>> q.append(x)
>>> q.appendleft(y)
>>> q
deque([y‘, a‘, b‘, c‘, x‘])

deque除了實現list的append()pop()外,還支持appendleft()popleft(),這樣就可以非常高效地往頭部添加或刪除元素。

3.Counter: 計數器,主要用來計數

Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。Counter類和其他語言的bags或multisets很相似。

c = Counter(abcdeabcdabcaba)
print c
輸出:Counter({a‘: 5, b‘: 4, c‘: 3, d‘: 2, e‘: 1})

4.OrderedDict: 有序字典

使用dict時,Key是無序的。在對dict做叠代時,我們無法確定Key的順序。

如果要保持Key的順序,可以用OrderedDict

>>> 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本身排序:

>>> od = OrderedDict()
>>> od[z‘] = 1
>>> od[y‘] = 2
>>> od[x‘] = 3
>>> od.keys() # 按照插入的Key的順序返回
[z‘, y‘, x‘]

5.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]
defaultdict字典解決方法

使dict時,如果引用的Key不存在,就會拋出KeyError。如果希望key不存在時,返回一個默認值,就可以用defaultdict

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: N/A)
>>> dd[key1‘] = abc‘
>>> dd[key1‘] # key1存在
abc‘
>>> dd[key2‘] # key2不存在,返回默認值
N/A

常見模塊和包