国产精品免费嫩草研究院|无遮羞动漫在线观看AV|国产麻豆精品传媒AV国产在线|村在线观看|寂寞情人1正版|韩国床震韩国床震古|精品系列专区久久

26 python進階collections標準庫

前言這個模塊實現了特定目標的容器,以提供Python標準內建容器dict ,list ,set , 和tuple 的替代選擇 。這個模塊提供了以下幾個函數
函數作用namedtuple()創建命名元組子類的工廠函數deque類似列表(list)的容器,實現了在兩端快速添加(append)和彈出(pop)ChainMap類似字典(dict)的容器類,將多個映射集合到一個視圖里面Counter字典的子類,提供了可哈希對象的計數功能OrderedDict字典的子類,保存了他們被添加的順序defaultdict字典的子類,提供了一個工廠函數,為字典查詢提供一個默認值UserDict封裝了字典對象,簡化了字典子類化UserList封裝了列表對象,簡化了列表子類化UserString封裝了字符串對象,簡化了字符串子類化namedtuplenamedtuple的由來因為元組的局限性:不能為元組內部的數據進行命名,所以往往我們并不知道一個元組所要表達的意義,所以引入namedtuple這個工廠函數,來構造一個帶字段名的元組 。namedtuple繼承自tuple類命名元組賦予每個位置一個含義,提供可讀性 。它們可以用于任何普通元組,并添加了通過名字獲取值的能力,通過索引值也是可以的 。
namedtuple的格式collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

  • typename: 返回一個新的元組子類,名為typename 。這個新的子類用于創建類元組的對象,可以通過字段名來獲取屬性值,同樣也可以通過索引和迭代獲取值 。
  • field_names: 像['x', 'y'] 一樣的字符串序列 。另外field_names可以是一個純字符串,用空白或逗號分隔開元素名,比如 'x y' 或者 'x, y'。
  • rename=False: 如果rename為true,無效字段名會自動轉換成_+索引值,比如 ['abc', 'def', 'ghi', 'abc'] 轉換成 ['abc', '_1', 'ghi', '_3'],消除關鍵詞def和重復字段名abc 。
  • default=None: defaults 可以為 None 或者是一個默認值的 iterable。default默認值賦值跟我們平常的默認值相反,default默認值是從最右邊開始,比如field_names中提供了3個字段['x', 'y', 'z'],default默認值設置為(1, 2),那么我們必須為x指定1個值,y默認值為1,z默認值為2
  • module=None: 如果 module 值有定義,命名元組的 module 屬性值就被設置 。
namedtuple聲明以及實例化我們首先創建一個User類,定義3個字段name、age、height,并給age設置默認值為18,給height設置了默認值180
User = namedtuple('User', ['name', 'age', 'height'], defaults=(18, 180))print(User.__mro__)我們查看結果
(<class '__main__.User'>, <class 'tuple'>, <class 'object'>)可以看到我們聲明的User類是繼承于tuple,接下來我們創建實例
user1 = User(name='jkc')user2 = User(name='jkc2', age=20, height=198)print(user1)print(user2)print(user1.name)print(user2.age)運行結果為
User(name='jkc', age=18, height=180)User(name='jkc2', age=20, height=198)jkc20namedtuple的方法和屬性命名元組還支持三個額外的方法和兩個屬性 。為了防止字段名沖突,方法和屬性以下劃線開始 。_make(iterable) 類方法從存在的序列或迭代實例創建一個新實例 。
>>> t = ['jkc3', 25, 190]>>> User._make(t)User(name='jkc3', age=25, height=190)_asdict() 返回一個新的 dict,它將字段名稱映射到它們對應的值
>>> user4 = User(name='jkc4', age=28, height=200)>>> user4._asdict(){'name': 'jkc4', 'age': 28, 'height': 200}

經驗總結擴展閱讀