1. 简介
官方文档:https://docs.python.org/3/library/collections.html#collections.namedtuple
命名元组为元祖中每个字段命名,使其能够像访问字典一样访问元祖中的值,使其更具有可读性,它具有普通元祖的方法和属性,也具有普通元祖不具有的独特方法和属性。
普通元祖和命名元祖最大区别之一在于:普通元祖的值定义完成后无法修改,但是命名元祖里面的值都是可以修改的
2. 参数介绍
先来看下 namedtuple
的代码定义
# namedtuple.__init__.py
def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None):
"""Returns a new subclass of tuple with named fields.
在定义 namedtuple
的时候有五个给出的有定义的参数,下面分别看下每个参数的含义
2.1 typename
typename
返回一个名为 typename 的新元组子类。
# namedtuple_test.py
from collections import namedtuple
Position = namedtuple('Position', 'x, y, z')
p1 = Position('1', 2, 3)
print(p1, type(p1))
# 输出
Position(x='1', y=2, z=3) <class '__main__.Position'>
这样可能不能很好的看出 typename
的作用,我们来修改下代码,就可以更容易的看出
from collections import namedtuple
Position = namedtuple('PositionName', 'x, y, z')
p1 = Position('1', 2, 3)
print(p1, type(p1))
# 输出
PositionName(x='1', y=2, z=3) <class '__main__.PositionName'>
可以看到为元祖真正命名的是 typename
这个参数。
我们可以使用 namedtuple.__repr__()
方法来查看 typename
的值,不过没有什么实用意义
Position = namedtuple('PositionName', 'x, y, z')
p = Position('1', 2, 3)
print(p.__repr__())
# 输出
PositionName(x='1', y=2, z=3)
2.2 field_names
field_names
元祖中每个字段的名称定义,是一个字符串序列。有三种方式可以定义
- 可以是一个列表例如
['x', 'y', 'z']
- 也可以是一个用空格分隔的单个字符串例如
'x, y, z'
- 或是用逗号分隔的单个字符串
'x y z'
from collections import namedtuple
Position1 = namedtuple('PositionName1', 'x, y, z')
Position2 = namedtuple('PositionName2', ['x', 'y', 'z'])
Position3 = namedtuple('PositionName3', 'x y z')
p1 = Position1('1', 2, 3)
p2 = Position2('1', 2, 3)
p3 = Position3('1'