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

发布于 2021-02-02 23:18:18

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

因此,我的问题是:

  • 什么叫元组?
  • 如何使用它们?
  • 为什么/何时应该使用命名元组而不是普通元组?
  • 为什么/何时应该使用普通元组而不是命名元组?
  • 是否有某种“命名列表”(命名元组的可变版本)?
关注者
0
被浏览
73
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    命名元组基本上是易于创建的轻量级对象类型。可以使用类对象变量解引用或标准元组语法来引用已命名的元组实例。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}可以使用所有常用的字典功能对其进行操作。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看