python 使用 namedtuple
2020-03-19 本文已影响0人
eeert2
有人说数据结构
才是编程的灵魂,可见数据结构的重要性。
一、为什么要使用namedtuple
?
python
的tuple
是一种不可变元素,因此这种数据结构是非常高效的。
我们在使用tuple
结构的时候可以通过解压和下标索引来获取元素内容:
user = ('eeert',18,'杭州市')
name,age,address = user # 元组支持解压
print(name,age,address) # eeert 18 杭州
# 元组支持索引
name = user[0]
age = user[1]
address = user[2]
print(name,age,address) # eeert 18 杭州
但是上面也引出了一个问题:
你怎么知道第一个元素就是"name",第二个元素是"age",第三个元素是"address"?
你不要以为我是在抬杠
,而是这确实是一个问题,namedtuple
的主要用途是将你的代码从下标操作中解脱出来。
二、如何使用namedtuple
借助collections.namedtuple
,我们可以创建一个namedtuple
类,"注意"
这里创建的是类,而不是对象。
在这个类
里面,我们指定类的名称
和属性
User = namedtuple('User', ['name', 'age', 'address'])
user = User('eeert', 34, '杭州')
# 可以和普通元组一样使用
name, age, address = user
print(name, age, address)
# 同时可以通过属性名称来访问
name = user.name
age = user.age
address = user.address
我们可以向普通的元组
一样使用它,同时也可以通过属性名称
来访问它,而且像pycharm
这种工具还会有代码提醒
可能有人要说我通过创建一个普通的类也能完成啊
。
是的你确实可以这样做,但是namedtuple
是元组的扩展,它是不可变的,所以它舍弃了python
对象的很多方法,结构更高效。
同时我们使用起来也更便捷,通过一行代码就能完成,而不是通过定义class ……
三、nametuple
的常用方法
元组是一种很高效,不可变的结构,这是它的特点,也决定了它的使用场景。
1. _replace
如果我们要改变nametuple
的值,那么可以使用_replace
。[ 虽然这违背了使用元组的原则
]
from collections import namedtuple
if __name__ == '__main__':
User = namedtuple('User', ['name', 'age', 'address'])
user = User('eeert', 18, '杭州')
new_user = user._replace(age=17)
print(user, new_user, sep='\n')
# User(name='eeert', age=18, address='杭州')
# User(name='eeert', age=17, address='杭州')
_replace
会在我们元组的基础上生成一个新的元组。这样并不高效,我们应该避免这种操作。
如果你要的数据结构经常有这种更改属性的操作,那么请使用字典dict
。