Python中的collections集合與typing數(shù)據(jù)類型模塊
一、collections集合
collections是Python內(nèi)建的一個集合模塊,提供了許多有用的集合類。
1、namedtuple:命名tuple對象
namedtuple是一個函數(shù),它用來創(chuàng)建一個自定義的tuple對象,并且規(guī)定了tuple元素的個數(shù),并可以用屬性而不是索引來引用tuple的某個元素。
namedtuple('名稱', [屬性list])
這樣一來,我們用namedtuple可以很方便地定義一種數(shù)據(jù)類型,它具備tuple的不變性,又可以根據(jù)屬性來引用,使用十分方便。
我們知道tuple可以表示不變集合,例如,一個點的二維坐標就可以表示成:
p = (1,2)
但是,看到(1, 2),很難看出這個tuple是用來表示一個坐標的。
定義一個class又小題大做了,這時,namedtuple就派上了用場:
from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(1, 2) p.x # 1 p.y #2
可以驗證創(chuàng)建的Point對象是tuple的一種子類:
isinstance(p, Point) #True isinstance(p, tuple) #True
類似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple定義:
Circle = namedtuple('Circle', ['x', 'y', 'r'])
2、deque:雙端隊列
使用list存儲數(shù)據(jù)時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數(shù)據(jù)量大的時候,插入和刪除效率很低。
deque是為了高效實現(xiàn)插入和刪除操作的雙向列表,適合用于隊列和棧:
deque除了實現(xiàn)list的append()和pop()外,還支持appendleft()和popleft(),這樣就可以非常高效地往頭部添加或刪除元素。
from collections import deque q = deque(['a', 'b', 'c']) q.append('x') q.appendleft('y') q #deque(['y', 'a', 'b', 'c', 'x'])
3、defaultdict:默認字典
使用dict時,如果引用的Key不存在,就會拋出KeyError。如果希望key不存在時,返回一個默認值,就可以用defaultdict。
注意默認值是調(diào)用函數(shù)返回的,而函數(shù)在創(chuàng)建defaultdict對象時傳入。
除了在Key不存在時返回默認值,defaultdict的其他行為跟dict是完全一樣的。
from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' dd['key1'] # key1存在 #'abc' dd['key2'] # key2不存在,返回默認值 #'N/A'
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, 'b': 2, 'c': 3} 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的順序返回 #odict_keys(['z', 'y', 'x'])
OrderedDict可以實現(xiàn)一個FIFO(先進先出)的dict,當(dāng)容量超出限制時,先刪除最早添加的Key:
from collections import OrderedDict class LastUpdatedOrderedDict(OrderedDict): def __init__(self, capacity): super(LastUpdatedOrderedDict, self).__init__() self._capacity = capacity def __setitem__(self, key, value): containsKey = 1 if key in self else 0 if len(self) - containsKey >= self._capacity: last = self.popitem(last=False) print('remove:', last) if containsKey: del self[key] print('set:', (key, value)) else: print('add:', (key, value)) OrderedDict.__setitem__(self, key, value)
5、Counter:計數(shù)器
Counter是一個簡單的計數(shù)器.
Counter實際上也是dict的一個子類,下面的結(jié)果可以看出,字符'g'、'm'、'r'各出現(xiàn)了兩次,其他字符各出現(xiàn)了一次。
例如,統(tǒng)計字符出現(xiàn)的個數(shù):
from collections import Counter c = Counter() for ch in 'programming': c[ch] = c[ch] + 1 print(c) #Counter({'p': 1, 'r': 2, 'o': 1, 'g': 2, 'a': 1, 'm': 2, 'i': 1, 'n': 1})
二、typing模塊
1、typing模塊的作用
- 類型檢查,防止運行時出現(xiàn)參數(shù)和返回值類型不符合。
- 作為開發(fā)文檔附加說明,方便使用者調(diào)用時傳入和返回參數(shù)類型。
- 該模塊加入后并不會影響程序的運行,不會報正式的錯誤,只有提醒。
- 注意:typing模塊只有在python3.5以上的版本中才可以使用,pycharm目前支持typing檢查。
2、使用typing模塊
- 在傳入?yún)?shù)時通過"參數(shù)名:類型"的形式聲明參數(shù)的類型;
- 返回結(jié)果通過"-> 結(jié)果類型"的形式聲明結(jié)果的類型。
在調(diào)用的時候如果參數(shù)的類型不正確pycharm會有提醒,但不會影響程序的運行。
from typing import List, Tuple, Dict def add(a: int, c: str, d: float, b: bool) -> Tuple[List, Tuple, Dict, bool]: list1 = list(range(a)) tup = (c, c, c) d = {"a": d} bl = b return list1, tup, d, bl print(add(5, "hhhh", 2.3, False)) # ([0, 1, 2, 3, 4], ('hhhh', 'hhhh', 'hhhh'), {'a': 2.3}, False)
對于如list列表等,還可以規(guī)定得更加具體一些。如:"-> List[str]”,規(guī)定返回的是列表,并且元素是字符串。
from typing import List def func(a: int, b: str) –> List[int or str] : # 使用or關(guān)鍵字表示多種類型 list1 = [] list1.append(a) list1.append(b) return list1
4、typing常用類型
- int、long、float: 整型、長整形、浮點型
- bool、str: 布爾型、字符串類型
- List、 Tuple、 Dict、 Set:列表、元組、字典、集合
- Iterable、Iterator:可迭代類型、迭代器類型
- Generator:生成器類型
到此這篇關(guān)于Python集合collections、數(shù)據(jù)類型typing模塊的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決Django后臺ManyToManyField顯示成Object的問題
今天小編就為大家分享一篇解決Django后臺ManyToManyField顯示成Object的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python?selenium?find_element()示例詳解
selenium定位元素的函數(shù)/方法可以分為兩類:find_element及find_elements,下面這篇文章主要給大家介紹了關(guān)于Python?selenium?find_element()的相關(guān)資料,需要的朋友可以參考下2022-07-07python實現(xiàn)微信每日一句自動發(fā)送給喜歡的人
這篇文章主要為大家詳細介紹了python實現(xiàn)微信每日一句自動發(fā)送給喜歡的人,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04python3獲取當(dāng)前目錄的實現(xiàn)方法
這篇文章主要介紹了python3獲取當(dāng)前目錄的實現(xiàn)方法,文中給大家提到了python3獲取當(dāng)前目錄和上級目錄的方法,需要的朋友可以參考下2019-07-07python實現(xiàn)requests發(fā)送/上傳多個文件的示例
今天小編就為大家分享一篇python實現(xiàn)requests發(fā)送/上傳多個文件的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06