python解析之namedtuple函數的用法

WBOY
發布: 2022-09-01 20:13:19
轉載
1605 人瀏覽過

【相關推薦:Python3影片教學

原始碼解釋:##

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)
    """
登入後複製

語法結構:

namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
登入後複製

  • typename: 代表新建的一個元組的名字。
  • field_names: 是元組的內容,是一個類似list的['x','y']
命名元組,使得元組可像清單一樣使用key存取(同時可以使用索引存取)。

collections.namedtuple 是一個工廠函數,它可以用來建立一個帶有字段名的元組和一個有名字的類別.

建立一個具名元組需要兩個參數,一個是類別名,另一個是類別的各個欄位的名字。

存放在對應欄位裡的資料要以一串參數的形式傳入到建構函式中(注意,元組的建構子卻只接受單一的可迭代物件)。

命名元組還有一些自己專有的屬性。最有用的:類別屬性_fields、類別方法 _make(iterable)和實例方法_asdict()。

範例程式碼1:

from collections import namedtuple
 
# 定义一个命名元祖city,City类,有name/country/population/coordinates四个字段
city = namedtuple('City', 'name country population coordinates')
tokyo = city('Tokyo', 'JP', 36.933, (35.689, 139.69))
print(tokyo)
 
# _fields 类属性,返回一个包含这个类所有字段名称的元组
print(city._fields)
 
# 定义一个命名元祖latLong,LatLong类,有lat/long两个字段
latLong = namedtuple('LatLong', 'lat long')
delhi_data = ('Delhi NCR', 'IN', 21.935, latLong(28.618, 77.208))
 
# 用 _make() 通过接受一个可迭代对象来生成这个类的一个实例,作用跟City(*delhi_data)相同
delhi = city._make(delhi_data)
 
# _asdict() 把具名元组以 collections.OrderedDict 的形式返回,可以利用它来把元组里的信息友好地呈现出来。
print(delhi._asdict())
登入後複製

運行結果:

##範例程式碼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)
登入後複製

運行結果:

範例程式碼3:

from collections import namedtuple
card = namedtuple('Card', ['rank', 'suit'])  # 定义一个命名元祖card,Card类,有rank和suit两个字段
class FrenchDeck(object):
    ranks = [str(n) for n in range(2, 5)] + list('XYZ')
    suits = 'AA BB CC DD'.split()  # 生成一个列表,用空格将字符串分隔成列表
 
    def __init__(self):
        # 生成一个命名元组组成的列表,将suits、ranks两个列表的元素分别作为命名元组rank、suit的值。
        self._cards = [card(rank, suit) for suit in self.suits for rank in self.ranks]
        print(self._cards)
 
    # 获取列表的长度
    def __len__(self):
        return len(self._cards)
    # 根据索引取值
    def __getitem__(self, item):
        return self._cards[item]
f = FrenchDeck()
print(f.__len__())
print(f.__getitem__(3))
登入後複製

執行結果:

範例程式碼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]))
登入後複製
##運行結果:

範例程式碼5:   【_make 從存在的序列或迭代建立實例】

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)
登入後複製

#執行結果:

範例程式碼6:    【_asdict 傳回一個新的ordereddict,將欄位名稱對應到對應的值】

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())
登入後複製

執行結果:

範例程式碼7:   【_replace 傳回一個新的實例,並將指定域替換為新的值】

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)
登入後複製

運行結果:

範例程式碼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)
登入後複製

運行結果:

範例程式碼9:   #【利用fields可以將兩個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)
登入後複製

運行結果:

範例程式碼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'))
登入後複製

運行結果:

##範例程式碼11: 

 【namedtuple是一個類,所以可以透過子類別更改功能】

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)
登入後複製

運行結果:

範例程式碼12: 

 【注意觀察兩種寫法的差異】

from collections import namedtuple
 
Point = namedtuple("Point", ["x", "y"])
p = Point(11, 22)
print(p)
print(p.x, p.y)
 
# namedtuple本质上等于下面写法
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)
登入後複製

運行結果:

#【相關推薦:

Python3影片教學

以上是python解析之namedtuple函數的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:jb51.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板