Глеб Asked:2023-11-21 20:06:06 +0000 UTC2023-11-21 20:06:06 +0000 UTC 2023-11-21 20:06:06 +0000 UTC Python 中的“命名元组”是什么? 772 什么是命名元组? 如何使用它们? 我应该在哪里使用命名元组而不是常规元组? PS这是enSO问题的翻译。对“为什么要做这样的翻译”主题感兴趣的人请点击这里。 python 1 个回答 Voted Best Answer Глеб 2023-11-21T20:06:06Z2023-11-21T20:06:06Z 什么是命名元组? 命名元组就是元组。 它们可以做常规元组可以做的一切。 但它们不仅仅是元组。 这是根据您的要求(命名字段和固定长度)以编程方式创建的元组子类。 例如,下面的示例创建了元组的子类,除了它具有固定长度(在本例中为三个)之外,它可以在常规元组所在的任何地方使用,没有任何问题。这就是所谓的里氏替换原则。 从 Python 3.6 开始,您可以使用类定义来创建命名元组typing.NamedTuple: from typing import NamedTuple class ANamedTuple(NamedTuple): """строка документации""" foo: int bar: str baz: list 上面的示例与该类类似,collections.namedtuple只是它具有类型注释和文档字符串。但这可以在 Python 2 及更高版本中使用: >>> from collections import namedtuple >>> class_name = 'ANamedTuple' >>> fields = 'foo bar baz' >>> ANamedTuple = namedtuple(class_name, fields) 创建实例的示例: >>> ant = ANamedTuple(1, 'bar', []) 我们检查它并使用属性: >>> ant ANamedTuple(foo=1, bar='bar', baz=[]) >>> ant.foo 1 >>> ant.bar 'bar' >>> ant.baz.append('anything') >>> ant.baz ['anything'] 更深入的解释: 要理解命名元组的概念,您必须首先了解元组是什么。元组本质上是一个不可变的列表(它不能在内存中就地修改)。 这是使用常规元组的示例: >>> student_tuple = 'Lisa', 'Simpson', 'A' >>> student_tuple ('Lisa', 'Simpson', 'A') >>> student_tuple[0] 'Lisa' >>> student_tuple[1] 'Simpson' >>> student_tuple[2] 'A' 可以使用迭代解包来“解包”: >>> first, last, grade = student_tuple >>> first 'Lisa' >>> last 'Simpson' >>> grade 'A' 命名元组是允许您通过名称而不是仅通过索引访问其元素的元组! 例如,您可以创建一个像这样的命名元组: >>> from collections import namedtuple >>> Student = namedtuple('Student', ['first', 'last', 'grade']) 为了提高可读性,您还可以传递一个包含由空格分隔的名称的字符串,而不是列表: >>> Student = namedtuple('Student', 'first last grade') 如何使用它们? 您可以使用它们执行与常规元组相同的所有操作(见上文),以及以下操作: >>> named_student_tuple = Student('Lisa', 'Simpson', 'A') >>> named_student_tuple.first 'Lisa' >>> named_student_tuple.last 'Simpson' >>> named_student_tuple.grade 'A' >>> named_student_tuple._asdict() OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')]) >>> vars(named_student_tuple) OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')]) >>> new_named_student_tuple = named_student_tuple._replace(first='Bart', grade='C') >>> new_named_student_tuple Student(first='Bart', last='Simpson', grade='C') 何时/为何应使用命名元组而不是常规元组? 它们可以用来代替对象(如果您要使用具有不可变属性且没有函数的对象)。 添加功能的能力可以通过子类来完成: class Point(namedtuple('Point', 'x y')): """adding functionality to a named tuple""" __slots__ = () @property def hypot(self): return (self.x ** 2 + self.y ** 2) ** 0.5 def __str__(self): return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
什么是命名元组?
命名元组就是元组。
它们可以做常规元组可以做的一切。
但它们不仅仅是元组。
这是根据您的要求(命名字段和固定长度)以编程方式创建的元组子类。
例如,下面的示例创建了元组的子类,除了它具有固定长度(在本例中为三个)之外,它可以在常规元组所在的任何地方使用,没有任何问题。这就是所谓的里氏替换原则。
从 Python 3.6 开始,您可以使用类定义来创建命名元组
typing.NamedTuple:上面的示例与该类类似,
collections.namedtuple只是它具有类型注释和文档字符串。但这可以在 Python 2 及更高版本中使用:创建实例的示例:
我们检查它并使用属性:
更深入的解释:
要理解命名元组的概念,您必须首先了解元组是什么。元组本质上是一个不可变的列表(它不能在内存中就地修改)。
这是使用常规元组的示例:
可以使用迭代解包来“解包”:
命名元组是允许您通过名称而不是仅通过索引访问其元素的元组!
例如,您可以创建一个像这样的命名元组:
为了提高可读性,您还可以传递一个包含由空格分隔的名称的字符串,而不是列表:
如何使用它们?
您可以使用它们执行与常规元组相同的所有操作(见上文),以及以下操作:
何时/为何应使用命名元组而不是常规元组?
它们可以用来代替对象(如果您要使用具有不可变属性且没有函数的对象)。
添加功能的能力可以通过子类来完成: