Python 中的 NamedTuple

2024年8月29日 | 阅读 7 分钟

在Python中,一种“特殊”的元组称为“命名元组”。Python初学者经常对此感到困惑,特别是当且何时需要实现它。

因为NamedTuple是一种元组,所以它可以执行元组的所有功能。然而,它不仅仅是一个简单的Python元组。在其他计算机语言中,就像C++一样,它更类似于一个“类”。它是元组的一个子类型,具有指定的字段和内置的、可编程的固定长度。本教程将解释Python NamedTuples,并展示如何使用它们以及何时以及为何需要使用它们。

什么是Python元组?

在继续之前,我们认为应该回顾一下Python中的元组。

Python中的元组是一个可以存储多个值的容器。请看以下示例。

代码

正如我们所见,我们使用括号来定义它。索引用于访问元素。(请记住,Python中的索引从零开始。)

代码

输出

32

numbers[1]Python元组的特点是,我们不能修改其元素,即元组的元素是不可变的。

Python NamedTuple语法

如所示,我们必须首先从Python的内置模块collections中导入NamedTuple。

以下是构建NamedTuple的基本语法

Name它是我们想要给NamedTuple起的名称的参数,并且

[Names of Values]它是包含不同值或属性名称的列表的占位符。

Python NamedTuple示例

如前所述,第一步是导入NamedTuple。

现在,我们可以使用前面部分中的语法来构建一个NamedTuple。

在此示例中,

我们选择将NamedTuple命名为Student,并在列表中提及值名称“Name”、“Class”、“Age”、“Subject”和“Marks”。这样,我们就创建了第一个NamedTuple——Student。

现在,我们可以像这样,使用Student创建一个具有所需规格的house Student1。

我们只需要[Names of Values]中标签或字段必须采用的具体值或内容。

要录入一个新学生,比如Student2,只需复制其值并粘贴到新变量的字段中。

我们会发现,我们可以将Student用作蓝图,随意记录新学生,而无需每次都调用字段标签。

如何使用点表示法获取NamedTuple的值

我们可以使用点方法来获取NamedTuple实例Student1和Student2的值。以下是语法。

以下代码示例演示了这一点。

代码

输出

15
11
"English"
79
"Itika"

同样,我们可以使用Student2.Age、Student2.Class等来检索与NamedTuple Student2相关的变量。

NamedTuple的访问方法

我们可以使用索引、关键字和getattr()函数来检索NamedTuple中的值。NamedTuple的字段值是严格排序的。因此,我们可以使用索引来查找它们。

NamedTuple将字段名称转换为属性。因此,可以使用getattr()从该字段中检索数据。

代码

输出

The name and country of the first participant are: Itika and India
The name and country of the second participant are: Arshia and Australia
The Age of participant 1 and 2 are: 21 and 19

NamedTuple的转换过程

可以使用几种技术将不同的集合转换为NamedTuple。我们还可以使用_make()函数将列表、元组或其他可迭代对象转换为NamedTuple实例。

我们还可以将字典数据类型对象转换为NamedTuple集合。对于此转换,需要使用**运算符。

作为OrderedDict数据类型项,NamedTuple可以生成带有其键的项。我们可以调用_asdict()函数将其转换为OrderedDict。

代码

输出

Participant(Name='Itika', Age='21', Country='India')
Participant(Name='Arshia', Age='19', Country='Australia')
{'Name': 'Itika', 'Age': '21', 'Country': 'India'}

NamedTuple的更多操作

还有其他方法,如_fields()和_replace()。我们可以通过调用_fields()函数来确定NamedTuple有哪些字段。_replace()函数用于替换一个值。

代码

输出

Participant(Name='Itika', Age='21', Country='India')
The fields of Participant: ('Name', 'Age', 'Country')
Participant(Name='Itika', Age='21', Country='Germany')

Python的NamedTuple如何工作?

让我们看看在Python中还可以用NamedTuple做什么。

1.Python中的NamedTuple是不可变的。

与普通元组一样,Python中的NamedTuple也不能被修改。我们无法更改其属性。

我们将尝试修改名为'Student'的元组的一个属性来演示这一点。

代码

输出

AttributeError                            Traceback (most recent call last)
Input In [41], in ()
      2 Student = namedtuple("Student",["Name","Class","Age","Subject","Marks"])
      3 Student1 = Student("Arshia", 12, 17, "Maths", 93)
----> 4 Student1.Class = 11

AttributeError: can't set attribute

可以看到,它引发了一个AttributeError。因此,我们可以推断NamedTuple是不可变的。

2.从Python NamedTuple创建Python字典

在Python中,NamedTuple类似于字典,我们可以通过以下方式将其转换为字典:

代码

输出

{'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93}

我们为此使用了.asdict()方法。这也生成了一个Python OrderedDict。

3.带默认值的NamedTuple

就像我们可以在普通类中设置属性的初始值一样,可以配置一个命名元组类,使其具有默认参数。由于具有默认值的字段应出现在所有没有默认值的字段之后,因此将默认值赋给最右边的属性。

让我们用1个默认条目重新定义Student类。

代码

输出

Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100)

如果我们只用一个值创建一个NamedTuple,则默认值100将应用于marks,这是我们在声明中最右边的字段。

如果我们明确指定Age字段,默认值Age会生效吗?

代码

输出

TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject'

答案是否定的。在NamedTuple中,字段的顺序非常严格。即使我们明确声明了任何内容,为了避免歧义和潜在的困难,默认值也必须是最右边的。

Python Namedtuple的优点

当然,如果看不到任何好处,没有人会使用NamedTuple。所以,我们有以下几点:

1.与标准元组不同,Python中的NamedTuple可以通过其名称检索变量。

代码

输出

17

2.由于它不包含每个实例的字典,Python NamedTuple在内存方面与传统元组一样高效。由于这个原因,它也比字典快。

结论

在本教程中,我们学习了NamedTuples如何使我们能够结合元组和字典的优点,如何构建NamedTuples以及如何使用它们。如何在Python中使用点表示法检索NamedTuples的值,它们是如何工作的。

如果读者熟悉Python的OOP,他们会发现这与Python类的功能相同。类及其属性充当创建更多对象或实例的蓝图,每个对象或实例都有自己的一组属性值。

然而,为了提高代码的清晰度,定义一个类并提供必要的属性通常是过度的,而且创建NamedTuples要快得多。