Python 的集合模塊有一個稱為“Namedtuple”的功能,“Namedtuple”是一個帶有命名元素的元組,使代碼更具表現力。就像 Python 中的字典一樣,“Namedtuple”允許我們使用元組的成員而不是索引來訪問元素。
使用 Python 命名元組增強代碼清晰度
了解如何創建、解構和優化內存使用,以獲得更簡潔、更易讀的代碼。探索實際示例和最佳實踐。
Python 的集合模塊有一個稱為“Namedtuple”的功能,“Namedtuple”是一個帶有命名元素的元組,使代碼更具表現力。就像?Python?中的字典一樣,“Namedtuple”允許我們使用元組的成員而不是索引來訪問元素。
創建命名元組
要創建一個命名元組,我們必須使用集合模塊中的函數“namedtuple”。
from?collections?import?namedtuple #?Define?a?employee?tuple?that?has?fields?id,?name?and?location. Employee?=?namedtuple?('Employee',?'id?name?location') #?Create?instances?of?Employee employee1?=?Employee?(id=10,?name='John?Doe',?location='Atlanta') employee2?=?Employee?(id=11,?name='Mick',?location='Dallas')
登錄后復制
從 Namedtuple 訪問元素
“Namedtuple”為元素訪問提供了雙重機制。首先,可以通過屬性名稱訪問元素,第二種機制使用傳統的數字索引。
print(f"{employee1.name}?-?{employee1.location}")?#?John?Doe?-?Atlanta print(f"{employee2.name}?-?{employee2.location}")?#?Mick?–?Dallas
登錄后復制
也可以使用數字索引訪問元素。
print(f"{employee1[1]}?-?{employee1[2]}")?#?John?Doe?-?Atlanta print(f"{employee2[1]}?-?{employee2[2]}")?#?Mick?–?Dallas
登錄后復制
不可變性
不可變性是“Namedtuples”的基本屬性,繼承自常規元組。這意味著一旦在創建過程中設置了字段的值,就無法修改。
try: ????employee1.name?=?'David' except?AttributeError?as?e: ????print(f"AttributeError:?{e}")?#?AttributeError:?can't?set?attribute
登錄后復制
方法
“Namedtuple”不僅提供了一種干凈且可讀的方法來構建數據,而且還提供了一些有用的方法,這些方法增強了“Namedtuple”的功能。
a) _asdict():_asdict()?方法以字典形式返回命名元組,提供了一種將“Namedtuples”轉換為與其他數據結構兼容的格式的便捷方法。
employee1._asdict()?#?{'id':?10,?'name':?'John?Doe',?'location':?'Atlanta'}
登錄后復制
b) _replace():_replace()?方法創建“Namedtuple”的新實例,其中指定的字段替換為新值。這種方法對于在允許修改的同時保持不可變性至關重要。
employee1_modified?=?employee1._replace(location='DFW') employee1_modified?#?Employee(id=10,?name='John?Doe',?location='DFW')
登錄后復制
c) _make():_make(iterable) 方法從可迭代對象創建“namedtuple”的新實例。例如,我們可以使用 _make() 方法從列表中創建一個 Namedtuple。
employee_list?=?[21,?'Bob','Gallup'] Employee._make(employee_list)?#?Employee(id=21,?name='Bob',?location='Gallup')
登錄后復制
解壓縮 Namedtuple
通過解包過程,Python 的“Namedtuples”使您能夠在單個簡潔的語句中將它們的值分配給各個變量。
id,?name,?location?=?employee1 print(f"id:?{id},?name:?{name},?location:{location}")
登錄后復制
將“Namedtuples”轉換為不同的數據結構
您可以使用 list() 構造函數將命名元組轉換為列表。下面是一個示例:
list(employee1)?#?[10,?'John?Doe',?'Atlanta']
登錄后復制
您可以使用“_asdict()”方法將命名元組轉換為字典,該方法返回一個 OrderedDict,您可以將其轉換為常規字典。下面是一個示例:
dict(employee1._asdict())?#?{'id':?10,?'name':?'John?Doe',?'location':?'Atlanta'}
登錄后復制
使用“Namedtuple”的優點
可讀性:“Namedtuples”通過為元素提供有意義的名稱,使代碼更具可讀性,從而消除了基于索引的訪問的需要。
變:與常規元組一樣,“Namedtuples”是不可變的。一旦創建,其值就無法更改。
內存效率:“Namedtuples”具有內存效率,與等效類相比,占用的空間更少。請務必注意,使用 Namedtuples 獲得的內存效率在涉及大量實例的方案或處理大型數據集時更為常見。
輕量級數據結構:?非常適合創建簡單的類,而無需自定義方法。
數據存儲:?便于存儲結構化數據,尤其是在不需要完整類的情況下。
API 和數據庫記錄:?用于表示從數據庫返回的記錄或從 API 接收的數據。
Python 中的“Namedtuple”非常適合需要具有命名字段的簡單、不可變數據結構的場景,例如
配置設置:使用“Namedtuple”表示帶有命名字段的配置設置,以便清晰易用。
數據庫記錄:“Namedtuple”可以表示數據庫記錄,明確哪個字段對應于表中的哪一列。
命令行解析:使用“Namedtuple”存儲解析的命令行參數,為輸入參數提供清晰的結構。
命名常量:“Namedtuple”可用于表示代碼中的命名常量,從而提供一種清晰易讀的方式來定義常量值。
“Namedtuples”通過提供清晰度、可讀性和不可變性在這些場景中表現出色,使其成為簡明結構化數據的寶貴工具。