具名元组namedtuple

先给结论 

namedtuple具名元组的优势

1、元组增强版

具名元组是元组的子类,继承了元组的所有特性,也就是说具名元组可以使用元组所有的方法和属性。可以理解为元组的增强版

具名元组实际上是一个类,可以像普通对象一样进行实例化、属性赋值和方法调用,可以为局具名元组添加更多的功能,使得代码更灵活。

2、节省内存

具名元组和元组存储数据消耗的内存是一样的,与字典相比大大节省了空间,轻量高效。

python中的元组是不可变的,因此每个元组的实例都需要额外的空间来存储元素,而具名元组使用较小的存储空间,因为字段名存储在类的__slots__属性中,而不是每个实例中。

3、可读性强

具名元组为元组中的每个元素都赋予了字段名,可以用字段名访问数据,可以理解为namedtuple 之于 tuple 就像 dict 之于 list,为每个元素起了名字,使用名字操作元素,大大提高了代码的可读性,使代码更易于维护。

4、自文档化

具名元组的字段名可以作为元组的文档,它们提供了对元素的描述和含义,这在协作开发和代码维护中尤为重要,可以避免因为字段含义不清晰而带来的问题。

namedtuple具名元组的劣势

namedtuple的适用场景

当你希望使用元组作为数据结构时,又希望可以通过给元组的每个元素命名,可以考虑使用namedtuple。

具名元组可以作为对字典的替代品,用于存储结构化的数据。与字典相比,具名元组更加节省空间,因为它不需要存储键,此外,具名元组的访问速度比字典快,因为它是不可变的。

当你打算抽象出一个类,而你设计的这个类只有属性而没有方法,仅仅为了保存数据,而且不做进一步的修改,那么可以考虑使用namedtuple,将大大减少你的代码量。

 namedtuple具名元组基本用法

namedtuple具名元组的定义与参数

1、定义

namedtuple() 工厂函数返回一个具名元组类,该函数位于 collections 模块下,具体定义形式如下:

namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

2、typename 参数

namedtuple 返回一个元组的子类(即具名元组类),类名为 typename。
通过具名元组类创建出来的具名元组对象,其内部元素支持属性查找(点号语法)、索引操作(方括号语法),并且是可迭代的。
具名元组对象还有自动生成的文档字符串,和一个 __repr__() 方法,把具名元组对象展示为 name=value 的格式。
下面是一小段示例代码:

from collections import namedtuple

Student = namedtuple('Student', 'name, gender')
s = Student('小花', '女')

# 属性访问
print(s.name)
print(s.gender)
"""
小花
女
"""

# 索引取值
print(s[0])
print(s[1])
"""
小花
女
"""

# 可迭代
for i in s:
    print(i)
"""
小花
女
"""

# docstring
print(s.__doc__)
"""
Student(name, gender)
"""

# repr
print(repr(s))
"""
Student(name='小花', gender='女')
"""

3、field_names 参数

field_names 是具名元组的字段名。
它可以通过两种形式指定:

字符串组成的序列
比如 ['x', 'y']、('x', 'y')。

一个长字符串,各个字段名之间用空格或逗号分隔
比如 'x y' 或者 'x, y'

字段名必须符合以下规则:

以字母开头
由字母、数字、下划线组成
不能与关键字重名
不能以下划线开头

4、rename 参数

rename 默认为 False,它是只能以关键字形式指定的参数,或者叫做强制关键字参数 keyword-only argument。
如果 rename=True,那么无效的字段名会被替换为 '_索引值'。
比如 ['abc', 'def', 'ghi', 'abc'] 会被转换成 ['abc', '_1', 'ghi', '_3']。其中与关键字重名的 'def' 和重复的 'abc' 都被替换成了 '_索引值'。

5、defaults 参数

defaults 参数默认为 None,是强制关键字参数。
它可以被设置为可迭代对象。
由于默认值参数必须在非默认值参数之后,所以 defaults 参数会被设置给最右边的字段名。
比如字段名为 'x, y, z',defaults 参数为 (1, 2) 时,y 默认为 1,z 默认为 2,x 则没有默认值。

6、module 参数

如果定义了 __module__ 的值,那么具名元组类的 __module__ 属性就会被设置为该值。

补充
__module__ 属性记录类定义的位置,如果定义的位置正好是主程序,那么该值为 '__main__',否则是类所属模块的名字。

具名元组的方法和属性

1、简单示例

from collections import namedtuple

# 简单示例
Point = namedtuple('Point', ['x', 'y'])

# 通过位置参数或者关键字参数实例化
p = Point(11, y=22)

# 索引取值
print(p[0] + p[1])
"""
33
"""

# 像普通元组一样解包
x, y = p
print(x, y)
"""
11 22
"""

# 通过名字访问字段
print(p.x + p.y)
"""
33
"""

# __repr__ 展现为 name=value
print(repr(p))
"""
Point(x=11, y=22)
"""

 2、_make 方法

除了从元组继承来的方法和属性,具名元组自己还有三个方法两个属性
为了避免与字段名重名,这些方法和属性都以一个下划线开头,这也是为什么字段名不能以下划线开头的原因。

classmethod somenamedtuple._make(iterable)

  • 从序列或者可迭代对象实例化一个具名元组
t = [11, 22]
print(Point._make(t))
"""
Point(x=11, y=22)
"""

3、 _asdict 方法

somenamedtuple._asdict()
返回一个 OrderedDict 有序字典对象,把字段名映射到相应的值。

p = Point(11, 22)
print(p._asdict())
"""
OrderedDict([('x', 11), ('y', 22)])
"""

4、 _replace 方法

somenamedtuple._replace(**kwargs)

  • _replace 接收关键字参数,给指定的字段重新赋值
  • 不改变原来的具名元组,而是会返回一个新的具名元组
p = Point(11, 22)
# _replace 不改变原具名元组!
new_p = p._replace(x=33)
print(p)
print(new_p)
"""
Point(x=11, y=22)
Point(x=33, y=22)
"""

5、 _fields 属性

somenamedtuple._fields
该属性是由字段名组成的元组。
在内省 introspection 时和从现有的字段名创建新的具名元组类型时很好用。

# 查看具名元组的字段
print(p._fields)
"""
('x', 'y')
"""

Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)
p = Pixel(11, 22, 128, 255, 0)
print(p)
"""
Pixel(x=11, y=22, red=128, green=255, blue=0)
"""

6、 _fields_defaults 属性

somenamedtuple._fields_defaults
返回一个字典,是字段名和默认值的映射

Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
print(Account._fields_defaults)
"""
{'balance': 0}
"""
print(Account('premium'))
"""
Account(type='premium', balance=0)
"""

7、 补充用法

  • 使用 getattr 获取属性
# 使用 getattr 获取属性
print(getattr(p, 'x'))
"""
11
"""
  • 用字典生成具名元组
# 解包字典作为参数生成具名元组
# 相当于以关键字形式指定的参数
d = {'x': 11, 'y': 22}
p = Point(**d)
print(p)
"""
Point(x=11, y=22)
"""

 

参考链接:

Python 3.7.1 中 namedtuple 具名元组基本用法详解_namedtuple _make-CSDN博客

Python之具名元组NamedTuple的使用 - 知乎

python具名元组有什么作用 - 互联网科技 - 亿速云

Python 中 NamedTuple 的理解 | 自由行

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值