我们知道c/c++语言中,有结构体这种数据类型:

struct{
string name;
int age;
char sex;
}student;
在对结构体对象进行赋值或者取值时可以使用.运算符进行操作。
那么问题来,python中有没有这个数据类型呢?答案是肯定有的,它就是命名元组(namedtyple)。

首先来看一下python中普通元组的不方便之处:

Bob=("bob",30,'male')
#如果想知道Bobde 名字,则需要使用索引位置进行读取,如下
name=Bob[0]
for people in [Bob]:
print("%s is %d years old %s" % peole)
#显示结果
bob is 30 years old male

1、namedtuple基础

通过上面的例子,访问元祖数据的时候是通过索引下标来操作的,对此需要熟记每个下标对应的具体含义,如果元祖有成千上百个数据,那么想记住每个下标对应的意义那是相当困难的,于是就出现了命名元祖namedtuple。

namedtuple对象的定义如以下格式:

collections.namedtuple(typename, field_names, verbose=False, rename=False)

返回一个命名元祖子类typename,其中参数的意义如下:
typename,:此元组的名称;
field_names: 元祖中元素的名称(类似于c结构体中的age等),此字段有多种表达方式,见例子;
rename:如果元素名称中含有python的关键字,则必须设置为rename=True,具体见下面;
verbose:默认就好;

举个小例子,加深一下自己的理解:

import collections
#其中field_names 有多种表达方式,如下
student=collections.namedtuple('student','name age sex')
student=cpllections.namedtuple('student',['name','age','sex'])
student=cpllections.namedtuple('student','name,age,sex') spark=student(name='sunYang',age=20,sex='male')
print(spark)
print("spark's name is %s" % spark.name)
print("%s is %d years old %s" % spark) 显示结果如下:
student(name='sunYang', age=20, sex='male')
spark's name is sunYang
sunYang is 20 years old male

通过上面的例子 其中student是元祖名称,‘name age sex’是元组总元素名称,用空格隔开,我们访问元祖对象中的元素时可以使用逗号操作符(.)读取对象中某个感兴趣的元素,而不必像原始元组中,需要记录下标代表的元素含义。

下面了解一下rename参数的作用:

    import collections
with_class=collections.namedtuple('Person','name age class gender',rename=True)
print with_class._fields
two_ages=collections.namedtuple('Person','name age gender age',rename=True) print two_ages._fields其输出结果为:
('name', 'age', '_2', 'gender')
('name', 'age', 'gender', '_3')

我们使用rename=True的方式打开重命名选项。
可以看到第一个集合中的class被重命名为 ‘2′ ; 第二个集合中重复的age被重命名为 ‘_3′;这是因为namedtuple在重命名的时候使用了下划线 加元素所在索引数的方式进行重命名。

2、namedtuple高级用法

我们通过定义一个命名元组,如下:
Point = namedtuple(‘Point’, [‘x’, ‘y’], verbose=True)
那么Point是一个元祖的子类,类结构具体如下:

class Point(tuple):
'Point(x, y)' __slots__ = () _fields = ('x', 'y') def __new__(_cls, x, y):
'Create new instance of Point(x, y)'
return _tuple.__new__(_cls, (x, y)) @classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new Point object from a sequence or iterable'
result = new(cls, iterable)
if len(result) != 2:
raise TypeError('Expected 2 arguments, got %d' % len(result))
return result def __repr__(self):
'Return a nicely formatted representation string'
return 'Point(x=%r, y=%r)' % self def _asdict(self):
'Return a new OrderedDict which maps field names to their values'
return OrderedDict(zip(self._fields, self)) def _replace(_self, **kwds):
'Return a new Point object replacing specified fields with new values'
result = _self._make(map(kwds.pop, ('x', 'y'), _self))
if kwds:
raise ValueError('Got unexpected field names: %r' % kwds.keys())
return result def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.'
return tuple(self) __dict__ = _property(_asdict) def __getstate__(self):
'Exclude the OrderedDict from pickling'
pass x = _property(_itemgetter(0), doc='Alias for field number 0') y = _property(_itemgetter(1), doc='Alias for field number 1')

python 命名元组(namedtuple)的更多相关文章

  1. python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数

    上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...

  2. python中的命名元组namedtuple

    namedtuple是继承自tuple的子类.namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性 可利用collections.namedtuple构建一个简单的类. fro ...

  3. Python 命名元组

    from collections import namedtuple # 类 p = namedtuple("Point", ["x", "y&quo ...

  4. python基础知识4——collection类——计数器,有序字典,默认字典,可命名元组,双向队列

    1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能  Counter 我们从中挑选一些相对常用的方法来举例: 在上面的例子 ...

  5. Python collections系列之可命名元组

    可命名元组(namedtuple)  根据nametuple可以创建一个包含tuple所有功能以及其他功能的类 1.创建一个坐标类 import collections # 创建类, defaultd ...

  6. Python元组与字符串操作(9)——随机数、元组、命名元组

    随机数 import random #导入random模块 randint(a,b) 返回[a,b]之间的整数 random.randint(0,9) randrange([start],stop,[ ...

  7. Python namedtuple(命名元组)使用实例

    Python namedtuple(命名元组)使用实例 #!/usr/bin/python3 import collections MyTupleClass = collections.namedtu ...

  8. Python 学习 第十四篇:命名元组

    Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值: collections ...

  9. python之命名元组的好处

    collections.namedtuple() 命名元组的一个主要用途是将你的代码从下标操作中解脱出来举例使用 # 使用 from collections import namedtuple Sub ...

随机推荐

  1. WEB接口测试之Jmeter接口测试自动化 (四)

    Jmeter是压力测试.接口测试工具,Ant是基于Java的构建工具,具有跨平台的作用,jenkins是持续集成工具.将这三者结合起来可以搭建一套webservice接口测试的持续构建环境.   1. ...

  2. ios app 开发中ipa重新签名步骤介绍

    作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要将安装包安装到ios机器上进行测试,这个时候我们就需要打包in house版本的ipa了,打包in house实际上是一个将ipa应 ...

  3. SW4STM32 全局宏定义

    /************************************************************************************ * SW4STM32 全局宏 ...

  4. 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub

    github地址:https://github.com/ErhuoHome/First.git 安装jdk与intellij idea没有太大问题,以前安装过eclipse 在程序方面,由于对真分数的 ...

  5. Unity3D-常用小功能详解,例子(得分变动效果、倒计时)

    Unity3D-Demo多个功能方法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Score Ind ...

  6. Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口

    Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...

  7. ubuntu journalctl — 检索 systemd 日志

    常用: 查看最近1000行log sudo journalctl -f --lines=1000 -u server.$PROJECT_NAME --no-full, --full, -l 如果字段内 ...

  8. 20155225 2016-2017-2 《Java程序设计》第五周学习总结

    20155225 2006-2007-2 <Java程序设计>第五周学习总结 教材学习内容总结 使用try.catch异常处理,异常处理继承架构等 使用Collection收集对象,了解C ...

  9. bulid-tool

    Build tool 中文构建工具.构建工具能够帮助你创建一个可重复的.可靠的.携带的且不需要手动干预的构建.构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求.假设你想要编译 ...

  10. LeetCode-Microsoft-Add Two Numbers II

    You are given two non-empty linked lists representing two non-negative integers. The most significan ...