Python第十一章-常用的核心模塊01-collections模塊

python 自稱 "Batteries included"(自帶電池, 自備乾糧?), 就是因為他提供了很多內置的模塊, 使用這些模塊無需安裝和配置即可使用.

本章主要介紹 python 的一些內置常用核心模塊

Python 常用的核心模塊

一、collections模塊

這是個有用的容器模塊, 提供了許多有用的集合, 來彌補通用的內置容器:list, dict, tuple, set

1.1 namedtuple()

namedtuple()是一個工廠函數, 用來創建一個tuple的子類型namedtuple.

我們以前的tuple只能通過下標去訪問, namedtuple訪問元素的時候可以使用類似屬性的東西去訪問.


基本使用

from collections import namedtuple    # 參數1: 要創建的 tuple 的類型的名字 參數2:新類型擁有的屬性列表  # 返回的是個類, 這個類的類名就是 Point(參數1確定的) , 擁有兩個屬性 x, y  # 變量 Point 只是表示我們又重新定義了變量指向了返回的那個類而已  Point = namedtuple("Point", ["x", "y"])  print(Point)  print(issubclass(Point, tuple))  # 確實是 tuple 的子類    # 使用返回的類型創建一個對象, 這個對象就表示一個平面中的點  p1 = Point(x=10, y=20)  print(p1.x)  print(p1.y)  

說明:

  1. 從上面可以很容易的看出來, 使用namedtuple可以很容易定義出一種數據類型
  2. 他具備tuple的不可變性, 又能根據屬性來引用, 一個字:用起來就是爽
  3. 定義一個表示平面的圓: Circle = namedtuple('Circle', ['x', 'y', 'r'])

繼承自tuple

由於namedtuple返回的類繼承自tuple, 所以tuple的屬性和方法在這裡都可以使用.

比如用下標去訪問, 用for去迭代等等.

from collections import namedtuple    Point = namedtuple("Point", ["x", "y"])  p1 = Point(x=10, y=20)    print(p1[0])  print(p1[1])    for i in p1:      print(i)  

3 個新增方法和 2 個新增屬性

類方法:_make(序列或迭代器)

從已知的序列或迭代器中創建一個實例

from collections import namedtuple    Point = namedtuple("Point", ["x", "y"])    nums = [20, 100]  p1 = Point._make(nums)  print(p1)    p2 = Point._make(range(10, 12))  print(p2)  


實例方法:_asdict()

返回一個列表(從3.1f開始是一個OrderedDict)

from collections import namedtuple    Point = namedtuple("Point", ["x", "y"])  p1 = Point(10, 20)  d = p1._asdict()  print(d)  


實例方法:_replace(關鍵字參數)

更改某個屬性的值, 由於namedtuple是不可變的, 所以返回的是一個新的namedtuple實例對象

from collections import namedtuple    Point = namedtuple("Point", ["x", "y"])  p1 = Point(10, 20)  p2 = p1._replace(y=100)  print(p2)  


類屬性:_source

返回創建的類的源碼

類屬性: _fields

返回創建類的所有屬性

from collections import namedtuple    Point = namedtuple("Point", ["x", "y"])  print(Point._fields)  

1.2 類:deque

deque是一個雙向隊列.

發音: deck 是 "double-ended queue" 的簡寫

deque線程安全, 內存高效, 支持在兩端添加和刪除元素.

相對list主要體現在添加和刪除效率比較高.


創建deque對象

deque([iterable[, maxlen]])
兩個參數都是可選
參數1: 可迭代對象, 會把裏面的數據初始近雙端隊列中
參數2: 雙端隊列允許的最大長度. 如果元素個數超出了這個只, 則只保留後面添加的.

from collections import deque    d = deque(range(10))  print(d)  


方法和屬性

append(x)

隊列的右邊添加元素.
注意:對隊列來說, 左邊指隊首, 右邊指隊尾

appendleft(x)

在隊列的左邊添加元素

clear()

情況隊列中的所有元素, 然後長度成為 0

copy()

淺複製隊列中的元素 (3.5新增)

count(x)

統計指定的元素 x 在隊里中出現的次數

extend(iterable)

向右擴展隊列

extendleft(iterable)

向左擴展隊列

index(x)

查找x在隊里中第一次出現的下標. 如果沒有找到, 則拋出異常

insert(i, x)

x插入到下標為i的位置

pop()

刪除並返回最右邊的元素

popleft

刪除並返回最左邊的元素

remove(x)

刪除隊列中第一個x

reverse()

翻轉隊列中的元素

只讀屬性:maxlen

創建隊列的時候設定的允許的元素的最大個數

1.3 類:Counter

Counter用來統計集合中元素出現的次數.

Counterdict的子類, 每個鍵值對都表示元素和元素出現的次數.

創建Counter對象

Counter([iterable-or-mapping])

參數:需要統計的迭代類型或mapping 類型

from collections import Counter    # 通過可迭代類型創建一個 Counter  c1 = Counter("abcabc3344efg")    print(c1)    # 通過 dict 創建一個 Counter  c2 = Counter({"a": 3, "b": 4})    # 表示 a 出現了3次  print(c2)    # 通過關鍵字創建一個 Counter  c3 = Counter(cats=4, dogs=8)    # 表示 cats 出現了4次  print(c3)  


有用的幾個方法

elements()

根據統計結果, 返回一個包含所有元素的可迭代類型的對象

most_common(n)

返回出現次數最多的前n個元素

from collections import Counter    c1 = Counter("abcabc3344efg")  print(sorted(c1.elements()))    # 所有的元素  print(c1.most_common(2))    c2 = Counter({"a": 3, "b": 4})  print(sorted(c2.elements()))  print(c2.most_common(2))    c3 = Counter(cats=4, dogs=8)  print(sorted(c3.elements()))  print(c3.most_common(1))  

1.4 類:defaultdict

在以前我們使用dict的時候, 如果訪問不存在的key時會拋出異常. 使用defaultdict則可以避免這個問題.

defaultdict(函數)

說明:

  1. 如果訪問的key不存在, 則會調用傳遞的函數, 把函數作為value
  2. 其餘的使用和dict一樣
from collections import defaultdict    d = defaultdict(lambda: "默認值")  d["b"] = "bbb"  # key 不存在, 則調用函數, 把函數返回值作為值. 並把鍵值對存入到 defaultdict中  print(d["a"])  print(d["b"])  print(d)  


from collections import defaultdict    s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]    d = defaultdict(list)  for k, v in s:      d[k].append(v)      print(sorted(d.items()))  


from collections import defaultdict  # 統計每個字符出現的次數  s = "abcdabAbc"    d = defaultdict(int)  for k in s:      d[k] += 1      print(sorted(d.items()))  

1.5 類:OrderedDict

dict的鍵值對是無序的.

ordereddict是可以記錄鍵值對的插入順序的dict.

from collections import OrderedDict    od = OrderedDict()  od["a"] = 10  od["c"] = 20  od["b"] = 40  for k, v in od.items():      print(k + " : " + str(v))