實際上 collections.namedtuple() 是乙個工廠方法,它返回的是python中標準元組型別的子類。我們提供給它乙個型別名稱以及相應的字段,它就返回乙個可例項化的類為你已經定義好的字段傳入值等。
from collections import namedtuple
subscriber = namedtuble('subscriber', ['addr', 'joined'])
sub = subscriber('[email protected]', '2012-10-19')
print(sub)
# subscriber(addr='[email protected]', joined='2012-10-19')
print(sub.addr)
print(sub.joined)
# '2012-10-19'
儘管namedtuple的例項看起來像乙個普通的類例項,但它的例項與普通的元組是可互換的,而且支援所有普通元組所支援的操作。例如:索引和分解
print(len(sub))
# 2addr, joined = sub
print(addr)
print(joined)
# '2012-10-19'
命名元組的主要作用在於將**同它所控制的元素位置間解耦。所以,如果從資料庫呼叫中得到乙個大型的元組列表,而且通過元素的位置來訪問資料,那麼假如在表單中新增了一列資料,那麼**就會崩潰。但如果首先將返回的元組轉型為命名元組,就不會出現問題。
from collections import namedtuple
stock = namedtuple('stock', ['name', 'shares', 'price'])
def compute_cost(records):
total = 0.0
for rec in records:
s = stock(*rec)
total += s.shares * s.price
# 若此處為 total += s[1] * s.[2] 則資料一變,**也不對
return total
注意:namedtuple 是不可變的 (immutable)
s = stock('acem', 100, 123.45)
print(s)
# stock(name='acme', share=100, price=123.45)
s.share = 75
# traceback (most recent call last):
# file "", line 1, in # attributeerror: can't set attribute
如果需要修改任何屬性,可以通過使用 namedtuple 例項的 _replace() 方法來實現,該方法建立了乙個全新的命名元組,並對相應的值做替換。
s = s._replace(share=75)
print(s)
# stock(name='acme', share=75, price=123.45)
_replace() 方法有乙個微妙的用途,那就是它可以作為一種簡便的方法填充具有可選或缺失欄位的命名元組。要做到這點,首先建立乙個包含預設值的「原型」元組,然後使用 _replace() 方法建立乙個新的例項,把相應的值替換掉
from collection import namedtuple
stock = namedtuple('stock', ['name', 'share', 'price', 'data', 'time'])
# create a prototype instance
stock_prototype = stock('', 0, 0.0, none, none)
# function to convert a dictionary to a stock
def dict_to_stock(s):
return stock_prototype.replace(**s)
讓我們來演示一下上面的**是如何工作的:
>>> a =
>>> dict_to_stock(a)
stock(name='acme', shares=100, price=123.45, date=none, time=none)
>>> b =
>>> dict_to_stock(b)
stock(name='acme', shares=100, price=123.45, date='12/17/2012', time=none)
如果我們的目標是定義乙個高效的資料結構,而且將來會修改各種例項屬性,那麼使用 namedtuple 並不是最佳選擇 python中的命名元組namedtuple
namedtuple是繼承自tuple的子類。namedtuple建立乙個和tuple類似的物件,而且物件擁有可訪問的屬性 可利用collections.namedtuple構建乙個簡單的類。from collections import namedtuple 定義乙個namedtuple型別use...
Python命名元組 namedtuple
python中提供了基礎的不可變資料結構元組tuple,對元組元素的訪問需通過索引來完成,對此需要熟記每個下標對應的具體含義。如果元素數量一多,要記清楚這些東西就會比較麻煩了,於是就出現了命名元組namedtuple。collections.namedtuple point x y 這樣就建立了乙個...
元組和命名元組
一 元組 1 元組的定義 在python中,元組由內建的tuple型別定義。建立元組,需要將所有的元組放在圓括號 內,以逗號分隔。構造只有乙個元素的元組時,括號內只包含乙個元素是不夠的,需要在其後面加上乙個逗號 t 1 改變優先順序 int str float t 1,元組型別 元組中的元素可以有任...