W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
你有一段通過下標訪問列表或者元組中元素的代碼,但是這樣有時候會使得你的代碼難以閱讀,于是你想通過名稱來訪問元素。
collections.namedtuple()
函數(shù)通過使用一個普通的元組對象來幫你解決這個問題。這個函數(shù)實際上是一個返回Python中標準元組類型子類的一個工廠方法。你需要傳遞一個類型名和你需要的字段給它,然后它就會返回一個類,你可以初始化這個類,為你定義的字段傳遞值等。代碼示例:
>>> from collections import namedtuple
>>> Subscriber = namedtuple('Subscriber', ['addr', 'joined'])
>>> sub = Subscriber('jonesy@example.com', '2012-10-19')
>>> sub
Subscriber(addr='jonesy@example.com', joined='2012-10-19')
>>> sub.addr
'jonesy@example.com'
>>> sub.joined
'2012-10-19'
>>>
盡管namedtuple的實例看起來像一個普通的類實例,但是它跟元組類型是可交換的,支持所有的普通元組操作,比如索引和解壓。比如:
>>> len(sub)
2
>>> addr, joined = sub
>>> addr
'jonesy@example.com'
>>> joined
'2012-10-19'
>>>
命名元組的一個主要用途是將你的代碼從下標操作中解脫出來。因此,如果你從數(shù)據(jù)庫調用中返回了一個很大的元組列表,通過下標去操作其中的元素,當你在表中添加了新的列的時候你的代碼可能就會出錯了。但是如果你使用了命名元組,那么就不會有這樣的顧慮。
為了說明清楚,下面是使用普通元組的代碼:
def compute_cost(records):
total = 0.0
for rec in records:
total += rec[1] * rec[2]
return total
下標操作通常會讓代碼表意不清晰,并且非常依賴記錄的結構。下面是使用命名元組的版本:
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
return total
命名元組另一個用途就是作為字典的替代,因為字典存儲需要更多的內(nèi)存空間。如果你需要構建一個非常大的包含字典的數(shù)據(jù)結構,那么使用命名元組會更加高效。但是需要注意的是,不像字典那樣,一個命名元組是不可更改的。比如:
>>> s = Stock('ACME', 100, 123.45)
>>> s
Stock(name='ACME', shares=100, price=123.45)
>>> s.shares = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>
如果你真的需要改變?nèi)缓蟮膶傩裕敲纯梢允褂妹M實例的 _replace()
方法, 它會創(chuàng)建一個全新的命名元組并將對應的字段用新的值取代。比如: >>> s = s._replace(shares=75)
s
Stock(name='ACME', shares=75, price=123.45)
_replace()
方法還有一個很有用的特性就是當你的命名元組擁有可選或者缺失字段時候,它是一個非常方便的填充數(shù)據(jù)的方法。你可以先創(chuàng)建一個包含缺省值的原型元組,然后使用 _replace()
方法創(chuàng)建新的值被更新過的實例。比如:
from collections import namedtuple
Stock = namedtuple('Stock', ['name', 'shares', 'price', 'date', '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 = {'name': 'ACME', 'shares': 100, 'price': 123.45}
>>> dict_to_stock(a)
Stock(name='ACME', shares=100, price=123.45, date=None, time=None)
>>> b = {'name': 'ACME', 'shares': 100, 'price': 123.45, 'date': '12/17/2012'}
>>> dict_to_stock(b)
Stock(name='ACME', shares=100, price=123.45, date='12/17/2012', time=None)
>>>
最后要說的是,如果你的目標是定義一個需要更新很多實例屬性的高效數(shù)據(jù)結構,那么命名元組并不是你的最佳選擇。這時候你應該考慮定義一個包含 __slots__
方法的類(參考8.4小節(jié))。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: