Python中的collections集合與typing數(shù)據(jù)類(lèi)型模塊
一、collections集合
collections是Python內(nèi)建的一個(gè)集合模塊,提供了許多有用的集合類(lèi)。
1、namedtuple:命名tuple對(duì)象
namedtuple是一個(gè)函數(shù),它用來(lái)創(chuàng)建一個(gè)自定義的tuple對(duì)象,并且規(guī)定了tuple元素的個(gè)數(shù),并可以用屬性而不是索引來(lái)引用tuple的某個(gè)元素。
namedtuple('名稱(chēng)', [屬性list])
這樣一來(lái),我們用namedtuple可以很方便地定義一種數(shù)據(jù)類(lèi)型,它具備tuple的不變性,又可以根據(jù)屬性來(lái)引用,使用十分方便。
我們知道tuple可以表示不變集合,例如,一個(gè)點(diǎn)的二維坐標(biāo)就可以表示成:
p = (1,2)
但是,看到(1, 2),很難看出這個(gè)tuple是用來(lái)表示一個(gè)坐標(biāo)的。
定義一個(gè)class又小題大做了,這時(shí),namedtuple就派上了用場(chǎng):
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
p.x # 1
p.y #2可以驗(yàn)證創(chuàng)建的Point對(duì)象是tuple的一種子類(lèi):
isinstance(p, Point) #True isinstance(p, tuple) #True
類(lèi)似的,如果要用坐標(biāo)和半徑表示一個(gè)圓,也可以用namedtuple定義:
Circle = namedtuple('Circle', ['x', 'y', 'r'])2、deque:雙端隊(duì)列
使用list存儲(chǔ)數(shù)據(jù)時(shí),按索引訪問(wèn)元素很快,但是插入和刪除元素就很慢了,因?yàn)閘ist是線性存儲(chǔ),數(shù)據(jù)量大的時(shí)候,插入和刪除效率很低。
deque是為了高效實(shí)現(xiàn)插入和刪除操作的雙向列表,適合用于隊(duì)列和棧:
deque除了實(shí)現(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:默認(rèn)字典
使用dict時(shí),如果引用的Key不存在,就會(huì)拋出KeyError。如果希望key不存在時(shí),返回一個(gè)默認(rèn)值,就可以用defaultdict。
注意默認(rèn)值是調(diào)用函數(shù)返回的,而函數(shù)在創(chuàng)建defaultdict對(duì)象時(shí)傳入。
除了在Key不存在時(shí)返回默認(rèn)值,defaultdict的其他行為跟dict是完全一樣的。
from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' dd['key1'] # key1存在 #'abc' dd['key2'] # key2不存在,返回默認(rèn)值 #'N/A'
4、OrderedDict:順序字典
使用dict時(shí),Key是無(wú)序的。在對(duì)dict做迭代時(shí),我們無(wú)法確定Key的順序。
如果要保持Key的順序,可以用OrderedDict:
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
d # dict的Key是無(wú)序的
#{'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會(huì)按照插入的順序排列,不是Key本身排序:
od = OrderedDict() od['z'] = 1 od['y'] = 2 od['x'] = 3 od.keys() # 按照插入的Key的順序返回 #odict_keys(['z', 'y', 'x'])
OrderedDict可以實(shí)現(xiàn)一個(gè)FIFO(先進(jìn)先出)的dict,當(dāng)容量超出限制時(shí),先刪除最早添加的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:計(jì)數(shù)器
Counter是一個(gè)簡(jiǎn)單的計(jì)數(shù)器.
Counter實(shí)際上也是dict的一個(gè)子類(lèi),下面的結(jié)果可以看出,字符'g'、'm'、'r'各出現(xiàn)了兩次,其他字符各出現(xiàn)了一次。
例如,統(tǒng)計(jì)字符出現(xiàn)的個(gè)數(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模塊的作用
- 類(lèi)型檢查,防止運(yùn)行時(shí)出現(xiàn)參數(shù)和返回值類(lèi)型不符合。
- 作為開(kāi)發(fā)文檔附加說(shuō)明,方便使用者調(diào)用時(shí)傳入和返回參數(shù)類(lèi)型。
- 該模塊加入后并不會(huì)影響程序的運(yùn)行,不會(huì)報(bào)正式的錯(cuò)誤,只有提醒。
- 注意:typing模塊只有在python3.5以上的版本中才可以使用,pycharm目前支持typing檢查。
2、使用typing模塊
- 在傳入?yún)?shù)時(shí)通過(guò)"參數(shù)名:類(lèi)型"的形式聲明參數(shù)的類(lèi)型;
- 返回結(jié)果通過(guò)"-> 結(jié)果類(lèi)型"的形式聲明結(jié)果的類(lèi)型。
在調(diào)用的時(shí)候如果參數(shù)的類(lèi)型不正確pycharm會(huì)有提醒,但不會(huì)影響程序的運(yùn)行。
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)對(duì)于如list列表等,還可以規(guī)定得更加具體一些。如:"-> List[str]”,規(guī)定返回的是列表,并且元素是字符串。
from typing import List
def func(a: int, b: str) –> List[int or str] : # 使用or關(guān)鍵字表示多種類(lèi)型
list1 = []
list1.append(a)
list1.append(b)
return list14、typing常用類(lèi)型
- int、long、float: 整型、長(zhǎng)整形、浮點(diǎn)型
- bool、str: 布爾型、字符串類(lèi)型
- List、 Tuple、 Dict、 Set:列表、元組、字典、集合
- Iterable、Iterator:可迭代類(lèi)型、迭代器類(lèi)型
- Generator:生成器類(lèi)型
到此這篇關(guān)于Python集合collections、數(shù)據(jù)類(lèi)型typing模塊的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法總結(jié)
在Python?中創(chuàng)建虛擬環(huán)境非常容易,但是刪除虛擬環(huán)境可能會(huì)有一些挑戰(zhàn),這篇文章主要給大家介紹了關(guān)于python中創(chuàng)建以及刪除虛擬環(huán)境的幾種方法,需要的朋友可以參考下2024-03-03
python實(shí)現(xiàn)linux下抓包并存庫(kù)功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)linux下抓包并存庫(kù)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Python使用flask-caching緩存數(shù)據(jù)的示例代碼
Flask-Caching 是 Flask 的一個(gè)擴(kuò)展,為任何 Flask 應(yīng)用程序添加了對(duì)各種后端的緩存支持,它基于 cachelib 運(yùn)行,并通過(guò)統(tǒng)一的 API 支持 werkzeug 的所有原始緩存后端,本文給大家介紹了Python使用flask-caching緩存數(shù)據(jù),需要的朋友可以參考下2024-12-12
樹(shù)莓派上利用python+opencv+dlib實(shí)現(xiàn)嘴唇檢測(cè)的實(shí)現(xiàn)
本文主要介紹了樹(shù)莓派上利用python+opencv+dlib實(shí)現(xiàn)嘴唇檢測(cè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
python通過(guò)第三方庫(kù)操作PDF文件的幾種常見(jiàn)方法
Python是一種高級(jí)編程語(yǔ)言,主要用于數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、圖像處理等領(lǐng)域,在PDF文件處理方面,Python有許多強(qiáng)大的庫(kù)和工具,這篇文章主要給大家介紹了關(guān)于python通過(guò)第三方庫(kù)操作PDF文件的幾種常見(jiàn)方法,需要的朋友可以參考下2024-02-02
python 使用csv模塊讀寫(xiě)csv格式文件的示例
這篇文章主要介紹了python 使用csv模塊讀寫(xiě)csv格式文件的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-12-12
Python學(xué)習(xí)之路之pycharm的第一個(gè)項(xiàng)目搭建過(guò)程
這篇文章主要介紹了Python學(xué)習(xí)之路之pycharm的第一個(gè)項(xiàng)目搭建過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

