Python元组拆包与具名元组实战指南

Owen
Owen
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python中元组的两种核心用法:元组拆包与具名元组。通过平行赋值、变量交换及*运算符处理不定长参数等实例,详解元组拆包的规则与技巧。同时介绍collections.namedtuple工厂函数,展示如何构建带字段名的元组类,并解析_fields、_make及_asdict等特有属性与方法,帮助开发者更高效地处理结构化数据。

前言

在Python中,元组是一种相对独特的内置序列类型。部分入门教程将其简单定义为“不可变的列表”,这种说法并不准确,因为它未能涵盖元组的全部特性。除了作为不可变列表使用外,元组还常用于表示没有字段名的数据记录。下文将重点围绕元组作为数据记录的属性展开,并介绍带有字段名的具名元组(namedtuple)函数,列表相关属性不在本文讨论范围内。

元组对于数据的记录

元组中的每个元素存储了记录中一个字段的数据,同时该元素的位置信息赋予了数据特定的意义。

以下代码演示了将元组用作记录的场景。如果在表达式中对元组内的元素进行排序,这些元素所携带的额外信息将会丢失,因为这些信息是与它们的位置紧密关联的。

#把元组作记录
  >>> xiaoming, xiaohua = (16, 18)
  >>> xiaoming
  16
  >>> students_info = [('xiaoming', 16), ('xiaohua', 18), ('hanmeimei', 20)]
  >>> for student in students_info:
    print('%s is %d years old.'%student)
  xiaoming is 16 years old.
  xiaohua is 18 years old.
  hanmeimei is 20 years old.
  >>>

在此示例中,我们将元组(16, 18)中的元素分别赋值给变量xiaoming和xiaohua。此外,在for循环中,%运算符将student元组中的元素对应到Print函数的格式字符串占位符中。这两个场景均属于元组拆包的应用。 元组拆包可应用于任何可迭代对象,唯一的硬性要求是:可迭代对象中的元素数量必须与接收这些元素的元组占位符数量一致。除非使用*来忽略多余的元素。

元组拆包

最易识别的元组拆包形式是平行赋值,即将可迭代对象中的元素一次性赋值给由对应变数组成的元组。例如:

>>> age_list = (16,18)
  >>> xiaoming, xiaohua = age_list #这里就是元组拆包

另一个常见的平行赋值示例是交换两个变量的值:

>>> a, b = b, a #Python就是如此的优雅

还可以使用*运算符将可迭代对象展开,作为函数的参数:

>>> divmod(20,8)
  (2, 4)
  >>> t = (20, 8)
  >>> divmod(*t)
  (2, 4)
  >>> quotient, remainder = divmod(*t)
  >>> quotient, remainder
  (2, 4)

使用*来处理剩余的元素

在Python中,函数使用*args来获取不确定数量的参数是一种经典写法。在Python 3中,这一概念被扩展到了平行赋值中:

>>> a, b, *rest = range(5)
  >>> a, b, rest
  (0, 1, [2, 3, 4])
  >>> a, b, *rest = range(3)
  >>> a, b, rest
  (0, 1, [2])
  >>> a, b, *rest = range(2)
  >>> a, b, rest
  (0, 1, [])

在平行赋值中,*运算符前缀只能用于一个变量名之前,但该变量可以出现在赋值表达式的任意位置:

>>> a, *others, b, c = range(5)
  >>> a, others, b, c
  (0, [1, 2], 3, 4)
  >>> *others, a, b, c = range(5)
  >>> others, a, b, c
  ([0, 1], 2, 3, 4)

具名元组

在Python中,collections.namedtuple是一个工厂函数,用于构建带有字段名的元组以及一个具有名称的类。 使用namedtuple构建的类实例所消耗的内存与普通元组相同,因为字段名存储在对应的类中。与普通对象实例相比,这些实例占用的空间更小,因为Python不会使用dict来存储这些实例的属性。

继续使用上述小明和小华的例子来展示具名元组:

>>> from collections import namedtuple
  >>> Student = namedtuple('Student', 'name age gender')
  >>> xiaoming = Student('xiaoming', 16, 'boy')
  >>> xiaoming
  Student(name='xiaoming', age=16, gender='boy')
  >>> xiaoming.age
  16
  >>> xiaoming[2]
  'boy'

Student = namedtuple(‘Student', ‘name age gender'),创建一个具名元组需要两个参数:类名和类的各个字段名。后者可以是包含多个字符串的可迭代对象,也可以是由空格分隔的字段名组成的字符串(如本示例所示)。具名元组可以通过字段名或位置来获取字段信息。

具名元组的特有属性

类属性_fields:包含该类所有字段名的元组

>>> xiaoming._fields
  ('name', 'age', 'gender')

类方法_make(iterable)::接受一个可迭代对象来生成该类的实例,其作用等价于Student构造函数

(*xiaohua_info)
  >>> xiaohua_info = ('xiaohua', 18, 'girl')
  >>> xiaohua = Student._make(xiaohua_info)
  >>> xiaohua
  Student(name='xiaohua', age=18, gender='girl')

实例方法_asdict():将具名元组以collections.OrdereDict的形式返回,可利用它将元组中的信息友好地展示出来

>>> xiaohua._asdict()
  OrderedDict([('name', 'xiaohua'), ('age', 18), ('gender', 'girl')])
  >>> for key, value in xiaohua._asdict().items():
    print(key,':',value)
  name : xiaohua
  age : 18
  gender : girl

总结

以上所述是小编给大家介绍的Python元组拆包和具名元组解析实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。