Python之命名元组 (namedtuple)

本文深入讲解Python中的命名元组(namedtuple)概念,包括其创建、使用及修改方式,并通过实例演示如何利用命名元组简化代码,提高代码可读性和维护性。

 

任务描述

本关任务:补充函数代码,完成对命名元组的简单操作。

命名元组 (namedtuple)

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

创建命名元组

命名元组的构造函数接受两个参数typenamefield_names

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

比如:

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

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

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

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

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

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

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

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

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

访问命名元组的元素

通过collections.namedtuple创建的命名元组类,实际上是元组类的子类,因此命名元组也可以通过索引访问元素:

  1. print(p1[0])
  2. print(p1[1])

得到的结果:
0
0

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

  1. print(p2.x)
  2. print(p2.y)

得到的结果:
1
1

修改元素

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

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

编程要求

根据右边编辑器中各个函数中的提示,将函数补充完整,使得程序能够正常运行并输出正确的结果。编辑区的4个函数将按照如下顺序被调用:

  1. p = CreatePoint()
  2. PrintPoint(p)
  3.  
  4. p = IncX(p)
  5. PrintPoint(p)
  6.  
  7. p = IncY(p)
  8. PrintPoint(p)

测试说明

正确的补充代码后应该得到的结果:
当前位置:x = 0,y = 0
当前位置:x = 1,y = 0
当前位置:x = 1,y = 1


import collections

def CreatePoint():
    #在此处创建并返回一个命名元组实例,有属性x,y,初值都为0
    Point = collections.namedtuple("Point","x,y")
    p = Point(x=0,y=0)
    return p
    
def IncX(p):
    #在此处对变量p的x坐标进行+1操作,然后返回修改过后的新对象
    p = p._replace(x=1)
    return p


def IncY(p):
    #在此处对参数p的y坐标进行+1操作,然后返回修改过后的新对象
    p = p._replace(y=1)
    return p
def PrintPoint(p):
    #按照:"当前位置:x = XXX,y = XXX" 的格式打印参数p
    print("当前位置:x = %d,y = %d"%(p.x,p.y))

 

### Python `collections.namedtuple` 使用教程 #### 创建具名元组 `namedtuple` 是 Python 内置库 `collections` 提供的一个工厂函数,用于创建带有字段名称的元组子类。这使得访问元素更加直观和易读。 ```python from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(11, y=22) print(p[0] + p[1]) # 输出: 33 print(p.x + p.y) # 输出: 33 ``` 上述代码展示了如何定义一个新的具名元组类型 `Point` 并实例化它[^1]。 #### 字段属性与方法 具名元组不仅支持索引访问,还允许通过字段名来获取值: ```python EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title') emp = EmployeeRecord('Alice', 30, 'Engineer') print(emp.name) # 输出: Alice print(emp.age) # 输出: 30 print(emp.title) # 输出: Engineer ``` 此外,具名元组提供了 `_asdict()` 方法返回有序字典表示形式以及 `_replace()` 来创建新版本的对象[^5]。 #### 替换部分字段 如果想要改变某个特定字段而不影响其他字段,则可以使用 `_replace()` 方法: ```python coordinate = namedtuple('Coordinate', ['x', 'y']) co = coordinate(10, 20) new_co = co._replace(x=30) print(co.x, co.y) # 输出: 10 20 print(new_co.x, new_co.y) # 输出: 30 20 ``` 此功能对于构建不可变对象非常有用,因为可以直接生成具有不同特性的副本而无需重新初始化整个对象[^4]。 #### 列表转换为具名元组 有时候会遇到从列表或其他可迭代序列中快速构造具名元组的需求,这时可以用到 `_make()` 类方法: ```python data = [100, 200] coordinate = namedtuple('Coordinate', ['x', 'y']) co = coordinate._make(data) print(co.x, co.y) # 输出: 100 200 ``` 这种方法简化了批量赋值的过程,提高了编码效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值