namedtuple:
具名元祖,可以使tuple更加语义化,之前我们写一个元祖tuple,对内部元素不能进行命名,往往我们并不知道一个元祖所要表达的意义,而namedtuple很好的解决了此问题:(加强版tuple)
1、语法:(常用的2个参数)
· tuple_name 元祖的名称,为字符串,返回一个元组子类,所以我们要对这个对象进行命名。
· field_name 元祖中元素的名称,通常是一个可迭代的数据,也可以是以逗号隔开的元素名称
namedtuple('tuple_name', 'field_names')
2、创建namedtuple:
创建一个具名元组,需要两个参数,一个是类名,另一个是类的各个字段名。后者可以是有多个字符串组成的可迭代对象,或者是以 空格 或 逗号分隔开的字段名组成的字符串:
User = namedtuple('User', ['name', 'age', 'height'])
# 或
User = namedtuple('User', 'name age height')
user = User('lxc', 22, 170)
print(user) # User(name='lxc', age=22, height=170)
返回的是元祖的子类:
from collections import namedtuple
print(type(namedtuple('User', ['name', 'age']))) # <class 'type'>
也可以使用可变参数或收集关键字参数来传递:
User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ['lxc', 22, 170]
tuple_dict = {
'name': 'lxc',
'age': 20,
'height': 170
}
user = User(*tuple_list)
user1 = User(**tuple_dict)
print(user) # User(name='lxc', age=22, height=170)
print(user1) # User(name='lxc', age=22, height=170)
3、取值:
普通元祖,只能通过 索引 来取值,而具名元祖不仅可以用索引来取值,还可以跟字典一样的取值方式:
User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
print(user.name) # 'lxc'
4、赋值:
必须使用_replace方法,且参数为关键字参数
User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
user = user._replace(name='吕星辰')
print(user) # User(name='吕星辰', age=22, height=170)
5、具名元祖的特有属性及方法:
除了元祖本身的属性方法之外,具名元祖有一些特有属性,常用地如下:
(1)属性 _fileds 输出这个类的所有字段名的元祖
User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
print(user._fields) # ('name', 'age', 'height')
(2)方法 _asdict() 把具名元祖以collection.OrdereDict的形似返回,实际上返回的就是创建字典的一种形式,可以使用dict()方法来创建对象:
User = namedtuple('User', ['name', 'age', 'height'])
tuple_list = ('lxc', 22, 170)
user = User(*tuple_list)
print(user._asdict()) # OrderedDict([('name', 'lxc'), ('age', 22), ('height', 170)])
print(dict(user._asdict())) # {'name': 'lxc', 'age': 22, 'height': 170}
6、与普通元祖性能对比:
具名元组和普通元组所需要的内存空间相同,所以 不必使用性能来权衡是否使用具名元组。