Python——命名元组 (namedtuple)

本文介绍Python中的命名元组(namedtuple)概念及应用。通过实例演示如何创建命名元组类、初始化属性并修改元组元素。适合初学者快速掌握命名元组的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命名元组 (namedtuple)

  • 完成对命名元组的简单操作。

命名元组 (namedtuple)

  • Python中提供了基础的不可变数据结构元组tuple,对元组元素的访问需通过索引来完成,对此需要熟记每个下标对应的具体含义。如果元素数量一多,要记清楚这些东西就会比较麻烦了,于是就出现了命名元组namedtuple。

创建命名元组

  • 命名元组的构造函数接受两个参数typename,field_names:
  • typename:元组的名字;

field_names:元组各个元素的名称,也就是属性名称。

比如:

collections.namedtuple("Point",["x","y"])

这样就创建了一个叫做Point的命名元组类,它拥有两个属性x,y。

第二个参数 [“x”,“y”]也可以写成 “x y"或者"x,y” ,即用空格或者逗号隔开属性名

即:

collections.namedtuple("Point","x y")
collections.namedtuple("Point","x,y")

我们可以将其赋值给一个变量:

Point = collections.namedtuple("Point","x,y")
#变量名不一定要和第一个参数相同
p = collections.namedtuple("Point","x,y")

以上得到的变量Point或者p并不直接是一个元组对象,它只是一个类,如果要创建它的实例,则需要像创建类实例一样调用它:

p1 = Point(x = 0, y = 0)
p2 = p(x = 1, y = 1)

这样就创建了两个实例p1,p2,他们的内容分别是x = 0,y = 0,x = 1,y = 1。

访问命名元组的元素

  • 通过collections.namedtuple创建的命名元组类,实际上是元组类的子类,因此命名元组也可以通过索引访问元素:
print(p1[0])
print(p1[1])

得到的结果:

0
0

当然,命名元组也可以通过属性访问:

print(p2.x)
print(p2.y)

得到的结果:

1
1

修改元素

  • 如果需要修改元组的元素,则不能简单的使用p1.x = 1,需要调用成员函数 _replace(),它会返回一个包含新值的新实例

比如:

p1 = p1._replace(x = 1) #将p1的x值从0换到1

编程要求

  • 具体要求如下:
  1. 创建一个叫做Point的命名元组类,属性:x、y
  2. 给x、y赋初始值为0
  3. 修改Point元组元素,将x的值从0换到1
  4. 修改Point元组元素,将y的值从0换到1
  5. 打印输出元组属性元素值

友情提示:def函数需要return

测试说明

输出结果:

当前位置:x = 0,y = 0
当前位置:x = 1,y = 0
当前位置:x = 1,y = 1

上代码:
在这里插入图片描述
在这里插入图片描述

如果注释理解有误,请大佬们多多评论指教!!

### Python 中 `namedtuple` 的使用方法 #### 创建命名元组 创建命名元组的方式有两种主要形式。一种是通过继承方式定义类,另一种是直接调用 `collections.namedtuple()` 方法。 ```python from collections import namedtuple # 定义一个名为 Point 的 named tuple 类型 Point = namedtuple('Point', ['x', 'y']) p = Point(11, y=22) print(p[0] + p[1]) # 输出数值相加的结果[^1] print(p.x + p.y) # 使用属性访问成员数据 ``` 两种定义 `namedtuple` 的语法被认为是等价的: ```python from typing import NamedTuple class Employee(NamedTuple): name: str id: int Employee = namedtuple('Employee', ['name', 'id']) ``` 上述两段代码可以互换使用并达到相同的效果[^2]。 #### 增强功能与灵活性 为了增加更多特性,比如设置默认值给某些字段,在定义时可以通过 `_fields_defaults` 参数来实现这一点: ```python Node = namedtuple('Node', ['value', 'left', 'right'], defaults=[None, None]) node = Node(value='root') print(node.left is node.right is None) # True ``` 此实例展示了如何利用 `defaults` 参数简化对象初始化过程中的参数传递需求[^4]。 #### 子类化字符串以增强功能性 虽然这不是 `namedtuple` 特有的概念,但在实际应用中经常遇到需要扩展内置类型的场景。对于字符串而言,可以通过包装的方式来实现在不改变原有行为的基础上添加新能力的目的[^3]: ```python class TaggedString(str): tag = "default" ts = TaggedString("example text") print(ts.tag) ``` 尽管这段代码不是严格意义上的 `namedtuple` 应用案例,但它体现了类似的模式——即基于现有结构构建更复杂的数据模型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值