Python中的「命名元組」是什麼?

閱讀Python 3.1中更改後 ,我發現了一些意外…… html

sys.version_info元組如今是一個命名的元組python

我之前從未據說過命名元組,而且我認爲元素能夠經過數字(例如在元組和列表中)或經過鍵(例如在字典中)進行索引。 我從未想到它們能夠同時被索引。 函數

所以,個人問題是: spa

  • 什麼叫元組?
  • 如何使用它們?
  • 爲何/什麼時候應該使用命名元組而不是普通元組?
  • 爲何/什麼時候應該使用普通元組而不是命名元組?
  • 是否有某種「命名列表」(命名元組的可變版本)?

#1樓

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)

#2樓

在Python內部,有一個很好使用的容器,稱爲命名元組,它可用於建立類的定義,並具備原始元組的全部功能。 htm

使用命名元組將直接應用於默認的類模板以生成一個簡單的類,此方法容許使用大量代碼來提升可讀性,而且在定義類時也很是方便。 對象


#3樓

命名元組容許向後兼容檢查此類版本的代碼 索引

>>> sys.version_info[0:2]
(3, 1)

同時經過使用此語法使未來的代碼更明確 ip

>>> sys.version_info.major
3
>>> sys.version_info.minor
1

#4樓

命名元組基本上是易於建立的輕量級對象類型。 可使用類對象變量解引用或標準元組語法來引用已命名的元組實例。 除了它們是不可變的,它們能夠相似地用於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}而且可使用全部經常使用的字典功能進行操做。

如前所述,您應該查看文檔以獲取構成這些示例的更多信息。


#5樓

namedtuple是一個很棒的功能,它們是數據的完美容器。 當您必須「存儲」數據時,可使用元組或字典,例如:

user = dict(name="John", age=20)

要麼:

user = ("John", 20)

字典方法是壓倒性的,由於字典比元組易變且慢。 另外一方面,元組是不可變的且輕量級的,可是對於數據字段中的大量條目卻缺少可讀性。

namedtuple是這兩種方法的完美折衷,它們具備出色的可讀性,輕巧性和不變性(並且它們是多態的!)。

相關文章
相關標籤/搜索