第二章:数据结构-collections:容器数据类型-namedtuple:带命名字段的元组子类(1)

2.2.5 namedtuple:带命名字段的元组子类
标准tuple使用数值索引来访问其成员。

bob = ('bob',30,'male')
print('Representation:',bob)

jane = ('Jane',29,'female')
print('\nFields by index:',jane[0])

print('\nFields by index:')
for p in [bob,jane]:
    print('{} is a {} year old {}'.format(*p))

对于简单用途,tuple是很方便的容器。
另一方面,使用tuple时需要记住对应各个值要使用哪个索引,这可能会导致错误,特别是当tuple有大量字段,而且构造元组和使用元组的位置相距很远时,namedtuple除了为各个成员指定数值索引外,还为其指定名字。
运行结果:

Representation: (‘bob’, 30, ‘male’)

Fields by index: Jane

Fields by index:
bob is a 30 year old male
Jane is a 29 year old female

2.2.5.1 定义
与常规的元组一样,namedtuple实例在内存使用方面同样很高效,因为它们没有每一个实例的字典。各种namedtuple都由自己的类表示,这个类使用namedtuple()工厂函数来创建。参数就是新类名和一个包含元素名的字符串。

import collections

Person = collections.namedtuple('Person','name age')

bob = Person(name='Bob',age=30)
print('\nRepresentation:',bob)

jane = Person(name='Jane',age=29)
print('\nField by name:',jane.name)

print('\nFields by index:')
for p in [bob,jane]:
    print('{} is {} years old'.format(*p))

如这个例子所示,除了使用标准元组的位置索引外,还可以使用点记法(obj.attr)按名字访问namedtuple的字段。
运行结果:

Representation: Person(name=‘Bob’, age=30)

Field by name: Jane

Fields by index:
Bob is 30 years old
Jane is 29 years old

与常规tuple类似,namedtuple也是不可修改的。这个限制允许tuple实例具有一致的散列值,这使得可以把它们用作字典中的键并包含在集合中。

import collections

Person = collections.namedtuple('Person','name age')

pat = Person(name='pat',age=12)
print('\nRepresentation:',pat)

pat.age = 21

如果试图通过命名属性改变一个值,那么会导致一个AttributeError。
运行结果:

Representation: Person(name=‘pat’, age=12)
Traceback (most recent call last):
File “G:/python3_library/chapter_2_数据结构/2_2_collections容器数据类型/2_2_5_namedtuple带命名字段的元组子类/2_2_5_1_定义/collections_namedtuple_immutable.py”, line 11, in
pat.age = 21
AttributeError: can’t set attribute

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值