閱讀Python 3.1中的更改後 ,我發現了一些意外…… html
sys.version_info元組如今是一個命名的元組 : python
我之前從未據說過命名元組,而且我認爲元素能夠經過數字(例如在元組和列表中)或經過鍵(例如在字典中)進行索引。 我從未想到它們能夠同時被索引。 函數
所以,個人問題是: spa
namedtuple是用於建立元組類的工廠函數 。 經過該類,咱們能夠建立可經過名稱調用的元組。 code
import collections #Create a namedtuple class with names "a" "b" "c" Row = collections.namedtuple("Row", ["a", "b", "c"], verbose=False, rename=False) row = Row(a=1,b=2,c=3) #Make a namedtuple from the Row class we created print row #Prints: Row(a=1, b=2, c=3) print row.a #Prints: 1 print row[0] #Prints: 1 row = Row._make([2, 3, 4]) #Make a namedtuple from a list of values print row #Prints: Row(a=2, b=3, c=4)
在Python內部,有一個很好使用的容器,稱爲命名元組,它可用於建立類的定義,並具備原始元組的全部功能。 htm
使用命名元組將直接應用於默認的類模板以生成一個簡單的類,此方法容許使用大量代碼來提升可讀性,而且在定義類時也很是方便。 對象
命名元組容許向後兼容檢查此類版本的代碼 索引
>>> sys.version_info[0:2] (3, 1)
同時經過使用此語法使未來的代碼更明確 ip
>>> sys.version_info.major 3 >>> sys.version_info.minor 1
命名元組基本上是易於建立的輕量級對象類型。 可使用類對象變量解引用或標準元組語法來引用已命名的元組實例。 除了它們是不可變的,它們能夠相似地用於struct
或其餘常見記錄類型。 它們是在Python 2.6和Python 3.0中添加的,儘管在Python 2.4中有實現的祕訣 。 ci
例如,一般將點表示爲元組(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 namedtuple Point = 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 referencing line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2) # use tuple unpacking x1, y1 = pt1
所以, 在您認爲對象表示法將使您的代碼更具pythonic性且更易於閱讀的任何地方 , 都應使用命名元組代替元組 。 我我的已經開始使用它們來表示很是簡單的值類型,尤爲是在將它們做爲參數傳遞給函數時。 它使函數更具可讀性,而看不到元組包裝的上下文。
此外, 您還能夠替換沒有功能的普通不可變類 ,僅將它們替換爲字段。 您甚至能夠將命名的元組類型用做基類:
class Point(namedtuple('Point', 'x y')): [...]
可是,與元組同樣,命名元組中的屬性是不可變的:
>>> Point = namedtuple('Point', 'x y') >>> pt1 = Point(1.0, 5.0) >>> pt1.x = 2.0 AttributeError: 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()
將命名的元組轉換爲字典,該pt1._asdict()
返回{'x': 1.0, 'y': 5.0}
而且可使用全部經常使用的字典功能進行操做。
如前所述,您應該查看文檔以獲取構成這些示例的更多信息。
namedtuple是一個很棒的功能,它們是數據的完美容器。 當您必須「存儲」數據時,可使用元組或字典,例如:
user = dict(name="John", age=20)
要麼:
user = ("John", 20)
字典方法是壓倒性的,由於字典比元組易變且慢。 另外一方面,元組是不可變的且輕量級的,可是對於數據字段中的大量條目卻缺少可讀性。
namedtuple是這兩種方法的完美折衷,它們具備出色的可讀性,輕巧性和不變性(並且它們是多態的!)。