RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1552408
Accepted
Глеб
Глеб
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 1 个回答
  • 64 Views

1 个回答

  • Voted
  1. 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)
    
    • 4

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5