Python中的“命名元組”是什么?讀Python3.1中的更改我發現了一些東西.。意外:sys.version_info元組現在是一個命名元組:我以前從未聽說過命名元組,我認為元素可以按數字(如元組和列表中的)或鍵(如DECTS)進行索引。我從沒想過他們會被用兩種方式編制索引。因此,我的問題是:什么叫元組?如何使用?為什么/何時我應該使用命名元組而不是普通元組?為什么/何時我應該使用普通元組而不是命名元組?是否有任何類型的“命名列表”(命名元組的可變版本)?
3 回答

元芳怎么了
TA貢獻1798條經驗 獲得超7個贊
命名元組基本上是容易創建的輕量級對象類型??梢允褂妙愃茖ο蟮淖兞咳∠没驑藴试M語法引用命名元組實例。它們可以類似于struct
或其他常見記錄類型,除非它們是不可變的。它們是在Python2.6和Python3.0中添加的,盡管Python 2.4實現的配方.
例如,將點表示為元組是常見的。(x, y)
..這導致代碼如下所示:
pt1?=?(1.0,?5.0)pt2?=?(2.5,?1.5)from?math?import?sqrt line_length?=?sqrt((pt1[0]-pt2[0])**2?+?(pt1[1]-pt2[1])**2)
通過使用命名元組,它變得更加可讀性:
from?collections?import?namedtuplePoint?=?namedtuple('Point',?'x?y')pt1?=?Point(1.0,?5.0)pt2?=?Point(2.5,?1.5)from?math?import?sqrt line_length?=?sqrt((pt1.x-pt2.x)**2?+?(pt1.y-pt2.y)**2)
但是,命名元組仍然向后兼容正常元組,因此以下內容仍然有效:
Point?=?namedtuple('Point',?'x?y')pt1?=?Point(1.0,?5.0)pt2?=?Point(2.5,?1.5)from?math?import?sqrt#?use?index?referencingline_length?=?sqrt((pt1[0]-pt2[0])**2?+?(pt1[1]-pt2[1])**2) ?#?use?tuple?unpackingx1,?y1?=?pt1
因此,您應該在任何地方使用命名元組而不是元組,因為您認為對象符號會使您的代碼更易讀,更易讀。..我個人已經開始使用它們來表示非常簡單的值類型,特別是當將它們作為參數傳遞給函數時。它使函數更具可讀性,而無需查看元組打包的上下文。
此外,你也可以代替普通的不變沒有函數的類只和他們一塊地。您甚至可以將命名的元組類型用作基類:
class?Point(namedtuple('Point',?'x?y')): ????[...]
但是,與元組一樣,命名元組中的屬性是不可變的:
>>>?Point?=?namedtuple('Point',?'x?y')>>>?pt1?=?Point(1.0,?5.0)>>>?pt1.x?=?2.0AttributeError:?can't?set?attribute
如果您希望能夠更改值,則需要另一種類型。有一個方便的食譜可變記錄類型它允許您將新值設置為屬性。
>>>?from?rcdtype?import?*>>>?Point?=?recordtype('Point',?'x?y')>>>?pt1?=?Point(1.0,?5.0)>>>?pt1?=?Point(1.0,?5.0)>>>?pt1.x?=?2.0>>>?print(pt1[0]) ????2.0
但是,我不知道有任何形式的“命名列表”允許您添加新字段。在這種情況下,你可能只想用字典。命名元組可以使用pt1._asdict()
返回{'x': 1.0, 'y': 5.0}
并且可以用所有常用的字典函數來操作。
添加回答
舉報
0/150
提交
取消