当前位置: 首页 > 面试题库 >

Python中的“命名元组”是什么?

臧曜瑞
2023-03-14
问题内容

我以前从未听说过命名元组,并且我认为元素可以用数字(如在元组和列表中)或键(如字典中)进行索引。我从未想到它们可以同时被索引。

因此,我的问题是:

  • 什么叫元组?
  • 如何使用它们?
  • 为什么/何时应该使用命名元组而不是普通元组?
  • 为什么/何时应该使用普通元组而不是命名元组?
  • 是否有某种“命名列表”(命名元组的可变版本)?

问题答案:

命名元组基本上是易于创建的轻量级对象类型。可以使用类对象变量解引用或标准元组语法来引用已命名的元组实例。struct除了它们是不可变的,它们可以类似于或其他常见的记录类型使用。它们是在Python 2.6和Python 3.0中添加的,尽管在Python 2.4中有实现的秘诀。

例如,通常将一个点表示为元组(x, y)。这导致如下代码:

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)

使用命名元组,它变得更具可读性:

from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

但是,命名元组仍然与普通元组向后兼容,因此以下内容仍然有效:

Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
 # use tuple unpacking
x1, y1 = pt1

因此,在你认为对象表示法将使你的代码更具pythonic性且更易于阅读的任何地方,都应使用命名元组而不是元组。我个人已经开始使用它们来表示非常简单的值类型,尤其是在将它们作为参数传递给函数时。它使函数更具可读性,而看不到元组包装的上下文。

此外,你还可以替换不带功能的普通不可变类,仅将它们替换为字段。你甚至可以将命名的元组类型用作基类:

class Point(namedtuple('Point', 'x y')):
    [...]

但是,与元组一样,命名元组中的属性是不可变的:

>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute

如果要能够更改值,则需要另一种类型。对于可变记录类型,有一个方便的用法,可让你为属性设置新值。

>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
    2.0

但是,我不知道有任何形式的“命名列表”可让你添加新字段。在这种情况下,你可能只想使用字典。命名的元组可以转换为字典,使用pt1._asdict()返回{'x': 1.0, 'y': 5.0}可以使用所有常用的字典功能对其进行操作。

如前所述,你应该查看文档以获取构成这些示例的更多信息。



 类似资料:
  • 问题内容: 任何人都可以修改namedtuple或提供替代类,以使其适用于可变对象吗? 主要是为了提高可读性,我想要执行类似于namedtuple的操作: 腌制所得物体必须是可能的。并且根据命名元组的特征,在表示对象时输出的顺序必须与构造对象时参数列表的顺序相匹配。 问题答案: 还有就是一个可变的替代方案- recordclass。 它具有与API相同的API和内存占用量,并且支持分配(它也应该更

  • 我有以下命名元组: 然后我想要以下内容: 两个名称元组之间有重复,我如何子类ReadElement以包含一个附加字段? 然而元组是创建在那里的,那么在新语句中,如果我修改自我成为一个列表,我会失去类型信息,我该如何避免这种情况?

  • 问题内容: 元类是什么,我们将它们用于什么? 问题答案: 元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。 虽然在Python中你可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。是Python中常见的元类。它本身是一个类,并且是它自己的类型。你将无法纯粹使用Python 重新创建类似的东西,但是Python有点作弊。要在Pyt

  • 问题内容: 在Python中,什么是元类?我们将它们用于什么? 问题答案: 元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。 尽管在Python中您可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。type是Python中常见的元类。type它本身是一个类,并且是它自己的类型。您将无法type纯粹在Python中重新创建类似的内

  • rank ▲ ✰ vote url 2 1919 1842 3137 url Python中的元类(metaclass)是什么? 元类是什么?如何使用元类? 类对象 在理解元类之前,你需要掌握Python里的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特. 在大多数语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立: >>> class Obje

  • 本文向大家介绍F# 歧视工会中元组的命名元素,包括了F# 歧视工会中元组的命名元素的使用技巧和注意事项,需要的朋友参考一下 示例 定义区分联合时,可以命名元组类型的元素,并在模式匹配期间使用这些名称。 另外,命名已区分的并集的元素可以提高代码的可读性以及与C#的互操作性-提供的名称将用于属性的名称和构造函数的参数。互操作代码中默认生成的名称为“ Item”,“ Item1”,“ Item2” ..