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






