python中namedtuple函數(shù)的用法解析
源碼解釋:
def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None):
"""Returns a new subclass of tuple with named fields.
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Point.__doc__ # docstring for the new class
'Point(x, y)'
>>> p = Point(11, y=22) # instantiate with positional args or keywords
>>> p[0] + p[1] # indexable like a plain tuple
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessible by name
33
>>> d = p._asdict() # convert to a dictionary
>>> d['x']
11
>>> Point(**d) # convert from a dictionary
Point(x=11, y=22)
>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields
Point(x=100, y=22)
"""語(yǔ)法結(jié)構(gòu):
namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
- typename: 代表新建的一個(gè)元組的名字。
- field_names: 是元組的內(nèi)容,是一個(gè)類似list的[‘x’,‘y’]
命名元組,使得元組可像列表一樣使用key訪問(wèn)(同時(shí)可以使用索引訪問(wèn))。
collections.namedtuple 是一個(gè)工廠函數(shù),它可以用來(lái)構(gòu)建一個(gè)帶字段名的元組和一個(gè)有名字的類.
創(chuàng)建一個(gè)具名元組需要兩個(gè)參數(shù),一個(gè)是類名,另一個(gè)是類的各個(gè)字段的名字。
存放在對(duì)應(yīng)字段里的數(shù)據(jù)要以一串參數(shù)的形式傳入到構(gòu)造函數(shù)中(注意,元組的構(gòu)造函數(shù)卻只接受單一的可迭代對(duì)象)。
命名元組還有一些自己專有的屬性。最有用的:類屬性_fields、類方法 _make(iterable)和實(shí)例方法_asdict()。
示例代碼1:
from collections import namedtuple
# 定義一個(gè)命名元祖city,City類,有name/country/population/coordinates四個(gè)字段
city = namedtuple('City', 'name country population coordinates')
tokyo = city('Tokyo', 'JP', 36.933, (35.689, 139.69))
print(tokyo)
# _fields 類屬性,返回一個(gè)包含這個(gè)類所有字段名稱的元組
print(city._fields)
# 定義一個(gè)命名元祖latLong,LatLong類,有l(wèi)at/long兩個(gè)字段
latLong = namedtuple('LatLong', 'lat long')
delhi_data = ('Delhi NCR', 'IN', 21.935, latLong(28.618, 77.208))
# 用 _make() 通過(guò)接受一個(gè)可迭代對(duì)象來(lái)生成這個(gè)類的一個(gè)實(shí)例,作用跟City(*delhi_data)相同
delhi = city._make(delhi_data)
# _asdict() 把具名元組以 collections.OrderedDict 的形式返回,可以利用它來(lái)把元組里的信息友好地呈現(xiàn)出來(lái)。
print(delhi._asdict())運(yùn)行結(jié)果:

示例代碼2:
from collections import namedtuple
Person = namedtuple('Person', ['age', 'height', 'name'])
data2 = [Person(10, 1.4, 'xiaoming'), Person(12, 1.5, 'xiaohong')]
print(data2)
res = data2[0].age
print(res)
res2 = data2[1].name
print(res2)運(yùn)行結(jié)果:

示例代碼3:
from collections import namedtuple
card = namedtuple('Card', ['rank', 'suit']) # 定義一個(gè)命名元祖card,Card類,有rank和suit兩個(gè)字段
class FrenchDeck(object):
ranks = [str(n) for n in range(2, 5)] + list('XYZ')
suits = 'AA BB CC DD'.split() # 生成一個(gè)列表,用空格將字符串分隔成列表
def __init__(self):
# 生成一個(gè)命名元組組成的列表,將suits、ranks兩個(gè)列表的元素分別作為命名元組rank、suit的值。
self._cards = [card(rank, suit) for suit in self.suits for rank in self.ranks]
print(self._cards)
# 獲取列表的長(zhǎng)度
def __len__(self):
return len(self._cards)
# 根據(jù)索引取值
def __getitem__(self, item):
return self._cards[item]
f = FrenchDeck()
print(f.__len__())
print(f.__getitem__(3))運(yùn)行結(jié)果:

示例代碼4:
from collections import namedtuple
person = namedtuple('Person', ['first_name', 'last_name'])
p1 = person('san', 'zhang')
print(p1)
print('first item is:', (p1.first_name, p1[0]))
print('second item is', (p1.last_name, p1[1]))運(yùn)行結(jié)果:

示例代碼5: 【_make 從存在的序列或迭代創(chuàng)建實(shí)例】
from collections import namedtuple
course = namedtuple('Course', ['course_name', 'classroom', 'teacher', 'course_data'])
math = course('math', 'ERB001', 'Xiaoming', '09-Feb')
print(math)
print(math.course_name, math.course_data)
course_list = [
('computer_science', 'CS001', 'Jack_ma', 'Monday'),
('EE', 'EE001', 'Dr.han', 'Friday'),
('Pyhsics', 'EE001', 'Prof.Chen', 'None')
]
for k in course_list:
course_i = course._make(k)
print(course_i)運(yùn)行結(jié)果:

示例代碼6: 【_asdict 返回一個(gè)新的ordereddict,將字段名稱映射到對(duì)應(yīng)的值】
from collections import namedtuple
person = namedtuple('Person', ['first_name', 'last_name'])
zhang_san = ('Zhang', 'San')
p = person._make(zhang_san)
print(p)
# 返回的類型不是dict,而是orderedDict
print(p._asdict())運(yùn)行結(jié)果:

示例代碼7: 【_replace 返回一個(gè)新的實(shí)例,并將指定域替換為新的值】
from collections import namedtuple
person = namedtuple('Person', ['first_name', 'last_name'])
zhang_san = ('Zhang', 'San')
p = person._make(zhang_san)
print(p)
p_replace = p._replace(first_name='Wang')
print(p_replace)
print(p)
p_replace2 = p_replace._replace(first_name='Dong')
print(p_replace2)運(yùn)行結(jié)果:

示例代碼8: 【_fields 返回字段名】
from collections import namedtuple
person = namedtuple('Person', ['first_name', 'last_name'])
zhang_san = ('Zhang', 'San')
p = person._make(zhang_san)
print(p)
print(p._fields)運(yùn)行結(jié)果:

示例代碼9: 【利用fields可以將兩個(gè)namedtuple組合在一起】
from collections import namedtuple
person = namedtuple('Person', ['first_name', 'last_name'])
print(person._fields)
degree = namedtuple('Degree', 'major degree_class')
print(degree._fields)
person_with_degree = namedtuple('person_with_degree', person._fields + degree._fields)
print(person_with_degree._fields)
zhang_san = person_with_degree('san', 'zhang', 'cs', 'master')
print(zhang_san)運(yùn)行結(jié)果:

示例代碼10: 【field_defaults】
from collections import namedtuple
person = namedtuple('Person', ['first_name', 'last_name'], defaults=['san'])
print(person._fields)
print(person._field_defaults)
print(person('zhang'))
print(person('Li', 'si'))運(yùn)行結(jié)果:

示例代碼11: 【namedtuple是一個(gè)類,所以可以通過(guò)子類更改功能】
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(4, 5)
print(p)
class Point(namedtuple('Point', ['x', 'y'])):
__slots__ = ()
@property
def hypot(self):
return self.x + self.y
def hypot2(self):
return self.x + self.y
def __str__(self):
return 'result is %.3f' % (self.x + self.y)
aa = Point(4, 5)
print(aa)
print(aa.hypot)
print(aa.hypot2)運(yùn)行結(jié)果:

示例代碼12: 【注意觀察兩種寫(xiě)法的不同】
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(11, 22)
print(p)
print(p.x, p.y)
# namedtuple本質(zhì)上等于下面寫(xiě)法
class Point2(object):
def __init__(self, x, y):
self.x = x
self.y = y
o = Point2(33, 44)
print(o)
print(o.x, o.y)運(yùn)行結(jié)果:

到此這篇關(guān)于python中namedtuple函數(shù)的用法解析的文章就介紹到這了,更多相關(guān)python namedtuple內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python簡(jiǎn)單獲取本機(jī)計(jì)算機(jī)名和IP地址的方法
這篇文章主要介紹了python簡(jiǎn)單獲取本機(jī)計(jì)算機(jī)名和IP地址的方法,涉及Python中socket模塊的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06
pandas 實(shí)現(xiàn)將兩列中的較大值組成新的一列
這篇文章主要介紹了pandas 實(shí)現(xiàn)將兩列中的較大值組成新的一列,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Python鏈?zhǔn)秸{(diào)用數(shù)據(jù)處理實(shí)際應(yīng)用實(shí)例探究
本文將深入介紹Python鏈?zhǔn)秸{(diào)用的概念、原理以及實(shí)際應(yīng)用,通過(guò)豐富的示例代碼,幫助讀者更全面地理解和應(yīng)用這一編程技巧2024-01-01
Python用tkinter實(shí)現(xiàn)自定義記事本的方法詳解
這篇文章主要為大家詳細(xì)介紹了Python用tkinter實(shí)現(xiàn)自定義記事本的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
PyQt5按下按鍵選擇文件夾并顯示的實(shí)現(xiàn)
這篇文章主要介紹了PyQt5按下按鍵選擇文件夾并顯示的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Python接口測(cè)試環(huán)境搭建過(guò)程詳解
這篇文章主要介紹了Python接口測(cè)試環(huán)境搭建過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python redis 批量設(shè)置過(guò)期key過(guò)程解析
這篇文章主要介紹了python redis 批量設(shè)置過(guò)期key過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
提高python代碼可讀性利器pycodestyle使用詳解
鑒于 Python 在數(shù)據(jù)科學(xué)中的流行,我將深入研究 pycodestyle 的使用方法,以提高 Python 代碼的質(zhì)量和可讀性。如果你想提升代碼質(zhì)量,歡迎收藏學(xué)習(xí),有所收獲,點(diǎn)贊支持2021-11-11

