Python第十一章-常用的核心模塊01-collections模塊
- 2020 年 4 月 4 日
- 筆記
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)
說明:
- 從上面可以很容易的看出來, 使用
namedtuple
可以很容易定義出一種數據類型 - 他具備
tuple
的不可變性, 又能根據屬性來引用, 一個字:用起來就是爽 - 定義一個表示平面的圓:
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
用來統計集合中元素出現的次數.
Counter
是dict
的子類, 每個鍵值對都表示元素和元素出現的次數.
創建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(函數)
說明:
- 如果訪問的
key
不存在, 則會調用傳遞的函數, 把函數作為value
- 其餘的使用和
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))