python 使用 namedtuple

2020-03-19  本文已影响0人  eeert2

有人说数据结构才是编程的灵魂,可见数据结构的重要性。

一、为什么要使用namedtuple?

pythontuple是一种不可变元素,因此这种数据结构是非常高效的。
我们在使用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这种工具还会有代码提醒

截屏2020-03-1909.34.23.png

可能有人要说我通过创建一个普通的类也能完成啊

是的你确实可以这样做,但是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

上一篇下一篇

猜你喜欢

热点阅读