继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Python基础系列讲解——collections的namedtuple使用

袁霄
关注TA
已关注
手记 86
粉丝 1.8万
获赞 1565

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')])

实例方法._replace ():修改对象属性

# 修改对象属性,注意要使用"_replace"方法
tuple_a = tuple_a._replace(age=22)
print(tuple_a)
# User(name='Tom', age=22, id='464643123')

掌握了具名元组的使用方法之后,当调用一些模块返回的元组数据时,就可以用具名元组进行初始化,这样增加了数据的可读性和操作上的便携性。

·····························
欢迎大家订阅《教你用 Python 进阶量化交易》专栏!

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP