Python中的元组(tuple)是大家非常熟悉的类型,它可以存储一个Python对象序列,不过元组与列表有所不同,元组中的元素值是不能被更改的。
由于元组不像字典那样可以为内部的元素命名,因此我们并不知道元组内的元素所表达的意义,在访问元组的时候也只能通过索引访问其中的元素。 于是Python标准库collections引入了namedtuple函数,它可以创建一个和元组类似但更为强大的类型——具名元组(namedtuple),也就是构造一个带字段名的元组。
namedtuple 函数的语法如下所示:
collections.namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)
typename:元组名称。可以理解为通过namedtuple创建的类名,通过这样的方式可以初始化各种实例化元组对象。
field_names: 元组中元素的名称。类似于字典的key,在这里定义的元组可以通过这样的key去获取里面对应索引位置的元素值。
rename: 为True时field_names中不能包含有非Python标识符、Python中的关键字以及重复的name,如果有则会默认重命名成‘_index’的样式(index表示该name在field_names中的索引,例:[‘abc’,‘def’, ‘ghi’, ‘abc’]将被转换成[‘abc’, ‘_1’, ‘ghi’, ‘_3’])
创建一个具名元组,需要两个参数,一个是类名,另一个是类的各个字段名。后者可以是有多个字符串组成的可迭代对象,或者是有空格分隔开的字段名组成的字符串。具名元组可以通过字段名或者位置来获取一个字段的信息。
import collections
tupleA = collections.namedtuple('User', ['name', 'age', 'id'])
tupleB = collections.namedtuple('User', 'name age id')
tuple_a = tupleA('Tom', '28', '464643123')
tuple_b = tupleB('Jack', '22', '464643143')
print(tuple_a, tuple_b)
# User(name='Tom', age='28', id='464643123')
# User(name='Jack', age='22', id='464643143')
具名元组是元组的子类,所以仍适用正常的元组操作,但它更友好,因为创建的具名元组实例,可以按字典方式来访问,如下所示:
# 获取用户的属性
print(tuple_a[0])
print(tuple_a[1])
print(tuple_a[2])
print(tuple_a.name)
print(tuple_a.id)
print(tuple_a.age)
print(tuple_a.age)
可见具名元组比普通元组具有更好的可读性,可以使代码更易于维护。同时与字典相比,又更加的轻量和高效。但是有一点需要注意,就是具名元组中的属性都是不可变的。任何尝试改变其属性值的操作都是非法的。
具名元组除了继承元组的一些方法和特性之外,具名元组还具有以下这些特有的属性:
类属性_fields:包含这个类所有字段名的元组
# 获取所有字段名
print(tuple_a._fields) # ('name', 'age', 'id')
类方法_make(iterable):接受一个可迭代对象来产生这个类的实例
# 也可以通过一个list来创建一个User对象,这里注意需要使用"_make"方法
tuple_a_l = tupleA._make(['Lucy', '12', 464464314])
print(tuple_a_l)
# User(name='Lucy', age='12', id=464464314)
实例方法_asdict():把具名元组以collections.OrdereDict的形式返回,可以利用它来把元组里的信息友好的展示出来
# 将User对象转换成字典,注意要使用"_asdict"
print(tuple_a._asdict())
# OrderedDict([('name', 'Tom'), ('age', 22), ('id', '464643123')])
掌握了具名元组的使用方法之后,当调用一些模块返回的元组数据时,就可以用具名元组进行初始化,这样增加了数据的可读性和操作上的便携性。