天天看點

Python程式設計:詳解命名元組(namedtuple)的使用要點

作者:傳新視界

前言

本文繼續來介紹Python集合子產品,這次主要簡明扼要的介紹其内的命名元組,即namedtuple的使用。閑話少叙,我們開始——記得點贊、關注和轉發哦~ ^_^

Python程式設計:詳解命名元組(namedtuple)的使用要點

建立命名元組

Python集合中的命名元組類namedTuples為元組中的每個位置賦予意義,并增強代碼的可讀性和描述性。它們可以在任何使用正常元組的地方使用,且增加了通過名稱而不是位置索引方式通路字段的能力。其來自Python内置子產品collections。其使用的正常文法方式為:

import collections

XxNamedTuple = collections.namedtuple(typename, field_names):

如果導入的方式不同,比如:import collections as cAlias、from collections import namedtuple、from collections import namedtuple as NamedTuple等,這樣我們建立的命名元祖子類的形式可以對應為:

XxNamedTuple = cAlias.namedtuple(……)

XxNamedTuple = namedtuple(……)

XxNamedTuple = NamedTuple(……)

其中:

參數typename:為傳回的新元組子類XxNamedTuple指定一個字元串型類名稱。新的子類用于建立類似元組的對象,所建立的對象具有可通過屬性查找、位置索引以及疊代的方式來通路的相關字段。子類的執行個體還有一個有用的文檔字元串(相當于幫助文檔,帶有typename和field_names)和一個有用的__repr__()方法,該方法以名稱=值的格式列出元組内容。

參數field_names:是通常是一個字元串序列,如[' x ', ' y ']。作為可選方式,field_names也可以是一個字元串,但包含的相應字段名是用空格和/或逗号分隔,例如' x y '或' x, y '。

任何有效的Python辨別符都可以用作命名字段名稱,但不能以下劃線(_)開始。有效的辨別符包括字母、數字和下劃線,但不要以數字或下劃線開始,不能使用關鍵字,如class、return、global、pass或raise等。

為了了解NamedTuple是如何工作的,我們假設有一個Employee對象,其擁有id、name和age屬性。請看代碼示例清單:

Python程式設計:詳解命名元組(namedtuple)的使用要點

運作程式輸出結果類似如下:

Employee(id='111', name='Solo Cui ', age='18')

按索引方式通路Employee的名子為 : Solo Cui

Employee(id='222', name='Annie Kent', age='26')

按鍵(字段名)通路Employee的名子為 : Annie Kent

另外,建立命名元組的函數中其它幾個參數用的少,這裡僅作簡單介紹:

參數rename:如果rename為true,無效的字段名将自動替換為位置名。例如,['abc', 'def', 'ghi', 'abc']被轉換為['abc', '_1', 'ghi', '_3'],消除了關鍵字def和重複的字段名abc。

參數defaults:可以是None或預設值的可疊代對象。由于帶有預設值的字段必須出現在任何沒有預設值的字段之後,是以預設值應用于最右邊的參數,依次向左。例如,如果字段名是['x', 'y', 'z'],預設值是(1,2),那麼x将是一個必需的參數,y将預設值為1,z将預設值為2。

參數module:如果定義了module,則命名元組的__module__屬性設定為該值。

命名元組執行個體沒有為每個執行個體單獨使用字典,是以它們是輕量級的,不需要比正常元組更多的記憶體。

命名元組特定方法

除了從元組繼承的方法之外,命名元組還支援另外三個方法和兩個屬性。為了防止與字段名發生沖突,方法和屬性名以下劃線開頭。分别介紹如下:

1)_make(iterable):

類方法,從現有序列或可疊代對象生成新執行個體。代碼示例如下:

Python程式設計:詳解命名元組(namedtuple)的使用要點

輸出結果類似如下:

Employee(id='333', name='Batman', age='28')

2)_asdict ():

傳回一個新的字典,它将字段名映射到對應的值。示例代碼如下:

Python程式設計:詳解命名元組(namedtuple)的使用要點

輸出結果類似如下:

{'id': '333', 'name': 'Batman', 'age': '28'}

3)_replace (**kwargs):

傳回一個命名元組的新執行個體,用新值替換指定字段。代碼示例如下:

Python程式設計:詳解命名元組(namedtuple)的使用要點

輸出結果如下:

Employee(id='777', name='Batman', age='34')

4)_fields:

以字元串元組方式列出字段名的。用于自省和從現有的命名元組建立新的命名元組類型。示例代碼如下:

Python程式設計:詳解命名元組(namedtuple)的使用要點

輸出結果為:

('id', 'name', 'age')

我們可以使用_fields屬性從現有的命名元組中建立新的命名元組。示例如下:

Python程式設計:詳解命名元組(namedtuple)的使用要點

輸出結果類似如下:

Pixel(x=5, y=8, red=128, green=255, blue=0)

結果的實體性指派

這裡所說的實體,類似Java中的資料實體對象——隻有簡單的屬性字段。而命名元組在為csv或sqlite3子產品操作而傳回的元組結果配置設定給對應字段名而裝配成簡單實體時特别有用,自動進行字段的對應指派。比如在目前Python程式位置有個employees.csv,其包含内容如下:

張三,26,工程師,開發部,中級

李四,32,項目經理,項目部,進階

通過示例,我們來完成Employee實體的命名元組的自動裝配,代碼示例如下:

Python程式設計:詳解命名元組(namedtuple)的使用要點

輸出結果類似如下:

張三 工程師 26 開發部 中級

李四 項目經理 32 項目部 進階

再簡單地來個資料庫操作和裝配實體的示例,代碼清單如下:

Python程式設計:詳解命名元組(namedtuple)的使用要點

我這裡隻是簡單的建立了資料庫并建立表,然後插入一條資料,再查詢并完成命名元組的實體化裝配和結果輸出。

運作輸出結果如下:

王武 經理

本文小結

本文主要介紹了Python自帶集合子產品中的命名元組(namedtuple)的使用,即可以當做一般的元組使用,由可基于字段名的方式通路元組值,并介紹了命名元組内部擴充的幾個方法和和屬性的應用示例。最後還介紹了基于命名元組的實體化封裝應用。基于代碼示例進行介紹,這樣便于你動手實踐,以便更好地掌握和了解。

最後,點贊+關注,分享出去,讓更多的Python愛好者看到,謝謝。下次見!