博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之命名元组 (namedtuple)
阅读量:2179 次
发布时间:2019-05-01

本文共 1645 字,大约阅读时间需要 5 分钟。

 

任务描述

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

命名元组 (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 collectionsdef 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 pdef IncY(p):    #在此处对参数p的y坐标进行+1操作,然后返回修改过后的新对象    p = p._replace(y=1)    return pdef PrintPoint(p):    #按照:"当前位置:x = XXX,y = XXX" 的格式打印参数p    print("当前位置:x = %d,y = %d"%(p.x,p.y))

 

转载地址:http://rdikb.baihongyu.com/

你可能感兴趣的文章
Java集合详解8:Java集合类细节精讲,细节决定成败
查看>>
Java并发指南1:并发基础与Java多线程
查看>>
Java并发指南2:深入理解Java内存模型JMM
查看>>
Java并发指南3:并发三大问题与volatile关键字,CAS操作
查看>>
Java并发指南4:Java中的锁 Lock和synchronized
查看>>
Java并发指南5:JMM中的final关键字解析
查看>>
Java并发指南6:Java内存模型JMM总结
查看>>
Java并发指南7:JUC的核心类AQS详解
查看>>
Java并发指南8:AQS中的公平锁与非公平锁,Condtion
查看>>
Java网络编程和NIO详解6:Linux epoll实现原理详解
查看>>
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
查看>>
Java网络编程与NIO详解8:浅析mmap和Direct Buffer
查看>>
Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型
查看>>
Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
查看>>
深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
查看>>
深入理解JVM虚拟机3:垃圾回收器详解
查看>>
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>