今天 发现了Python 中有一个可以给tuple  一个名字的一个方法,叫namedtuple

from collections import namedtuple

# encoding: utf-8
from collections import namedtupleperson =('name','age','sex','mail')
Person = namedtuple('Person',person,verbose=True)
p = Person('changyubiao',18,"male",'931367095@qq.com')
print type(p)
print p.name ,p.age,p.sex,p.mail

发现是可以 打印出结果的

<class '__main__.Person'>

changyubiao 18 male 931367095@qq.com

觉得这不错, 可以属性名,来访问元祖而不用小标,这样还是比较好,如果特别的属性,就可以通过这种方式。后来看一下,它的官方文档。

namedtuple() factory function for creating tuple subclasses with named fields   ,就是 返回一个子类tuple 用给出 那些字段 ,name ,age ,sex ,mail 等。

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
Returns a new tuple subclass named typename. The new subclass is used to create tuple-like objects that have fields accessible by attribute lookup as well as being indexable and iterable. Instances of the subclass also have a helpful docstring (with typename and field_names) and a helpful __repr__() method which lists the tuple contents in a name=value format.The field_names are a sequence of strings such as ['x', 'y']. Alternatively, field_names can be a single string with each fieldname separated by whitespace and/or commas, for example 'x y' or 'x, y'.Any valid Python identifier may be used for a fieldname except for names starting with an underscore. Valid identifiers consist of letters, digits, and underscores but do not start with a digit or underscore and cannot be a keyword such as class, for, return, global, pass, print, or raise.If rename is true, invalid fieldnames are automatically replaced with positional names. For example, ['abc', 'def', 'ghi', 'abc'] is converted to ['abc', '_1', 'ghi', '_3'], eliminating the keyword def and the duplicate fieldname abc.If verbose is true, the class definition is printed just before being built.Named tuple instances do not have per-instance dictionaries, so they are lightweight and require no more memory than regular tuples.
'''返回一个名为typename的新的元组子类。新的子类用于创建具有可通过属性查找访问的字段的元组对象,以及可索引和可​​迭代的对象。子类的实例也有一个有用的docstring(带有typename和field_names)和一个有用的__repr __()方法,它以一个name = value格式列出元组内容。field_names是一串字符串,如['x','y']。或者,field_names可以是单个字符串,每个字段名用空格和/或逗号分隔,例如'x y'或'x,y'。除了以下划线开头的名称以外,任何有效的Python标识符都可以用于字段名。有效的标识符由字母,数字和下划线组成,但不以数字或下划线开头,不能是关键字,例如class,for,return,global,pass,print或raise。如果重命名为true,则无效的字段名会自动替换为位置名称。例如,['abc','def','ghi','abc']被转换为['abc','_1','ghi','_3'],消除了关键字def和重复的字段名abc 。如果verbose为true,则在构建之前打印类定义。命名的元组实例没有每个实例的字典,所以它们是轻量级的,不需要比常规元组更多的内存。

person =('name','age','sex','mail')
Person = namedtuple('Person',person)

对于第二句话,为什么 要有一个‘Person’  呢?  这个 有什么用呢,之后 我看了实现。 其实官方文档 也说了, namedtuple() 会根据这个typename , 创建一个子类 类名 就是typename , 返回出去,之后赋值给Person ,后面 字段就是属性了,会根据这个这个元祖来生成 类的属性。当然 这些属性必须要满足变量名称的定义规则,不能是关键字,不能以数字开头,等等。否则 会报错的。   有这个参数 verbose=True  就可以看到类的生成过程。让我们来一起看下。

person =('name','age','sex','mail')
Person = namedtuple('Person',person,verbose=True)

在控制台中,就能看到Person 构造过程, 是继承tuple , 一个子类, Person 就是那个类型, 就是namedtuple  第一个参数,这里就解释,为啥要有第一个参数。

class Person(tuple):'Person(name, age, sex, mail)'__slots__ = ()_fields = ('name', 'age', 'sex', 'mail')def __new__(_cls, name, age, sex, mail):'Create new instance of Person(name, age, sex, mail)'return _tuple.__new__(_cls, (name, age, sex, mail))@classmethoddef _make(cls, iterable, new=tuple.__new__, len=len):'Make a new Person object from a sequence or iterable'result = new(cls, iterable)if len(result) != 4:raise TypeError('Expected 4 arguments, got %d' % len(result))return resultdef __repr__(self):'Return a nicely formatted representation string'return 'Person(name=%r, age=%r, sex=%r, mail=%r)' % selfdef _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 Person object replacing specified fields with new values'result = _self._make(map(kwds.pop, ('name', 'age', 'sex', 'mail'), _self))if kwds:raise ValueError('Got unexpected field names: %r' % kwds.keys())return resultdef __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'passname = _property(_itemgetter(0), doc='Alias for field number 0')age = _property(_itemgetter(1), doc='Alias for field number 1')sex = _property(_itemgetter(2), doc='Alias for field number 2')mail = _property(_itemgetter(3), doc='Alias for field number 3')

从这里可以看出整个类的构造过程, 也会对namedtuple  有更好的理解。 其实namedtuple  并没有破坏用下标访问

# encoding: utf-8
from collections import namedtupleperson =('name','age','sex','mail')
Person = namedtuple('Person',person,verbose=False)p = Person('changyubiao',18,"male",'931367095@qq.com')print p.name ,p.age,p.mail,p.sexfor i in range(0,4):print p[i]

没有任何问题, 还是 可以正常访问的。

还有一个 namedtuple  一个参数 rename   这个就是 如果的 属性 设置不能作为变量名 , 会直接报错。 如果用rename=True, Python  会自动重新帮你命名,来符合变量的命名规范。来看一个例子

我把Person 的属性 mail  改成了  5mail  肯定不符合规范, Python 构建 子类的时候, 就会报错。

person =('name','age','sex','5mail')
Person = namedtuple('Person',person,verbose=True,)p = Person('changyubiao',18,"male",'931367095@qq.com')

如果 构造namedtuple 的时候 ,加上 rename=True, 来看下结果

person =('name','age','sex','5mail')
Person = namedtuple('Person',person,verbose=True,rename=True)

这里明显可以看出 第四个字段,变成了 _3 名称,python 自己重新的命名。

访问下 属性

print p.name ,p.age,p._3,p.sexfor i in range(0,4):print (p[i])

成功的 访问到了邮箱了,这就是rename  的作用。

总结: 对于这种namedtuple  有什么好处,显而易见 就是方便 访问,不需要记住下标,可以访问元素,元祖 的元素比较多的时候,用这个还是不错的。

但是 问题来了, 为什么不用字典呢?  和namedtuple  有什么区别呢?

以下是我的这个拙见:

namedtuple    是只读的,第一  不能修改元祖,它还是元祖,第二 它是有序的。第三, 查找速度man,  它的优点呢? 占用内存小(和字典相比)

字典的特点  , 第一  ,value 的值是可以更改的,第二 ,查找速度快, 第三 字典 占用内存是比较大的。第四 ,字典是无序的, 这点和tuple 是完全不一样的。

分享快乐,留住感动。    Mon Nov 06 16:25:57 2017   ---biaoge

python中namedtuple的用法相关推荐

  1. python中namedtuple函数用法详解

    源码解释: def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None):"" ...

  2. python namedtuple用法_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

  3. 五分钟理解yield在python中的简单用法,让你不再迷惑

    很多同学无论是在学习python还是使用python的过程中,都会遇到yield关键字,这个让人头大的问题,今天,就给大家分享一下我自学yield的心路历程 基本概念: (1)在 Python 中,使 ...

  4. format函数python的顺序_[转载] Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

  5. python代码大全表解释-python中的字典用法大全的代码

    如下代码是关于python中的字典用法大全的代码. #!/usr/bin/env python # # [SNIPPET_NAME: Dictionaries 101] # [SNIPPET_CATE ...

  6. python教程实例-Python中函数的用法实例教程

    本文以数值计算为例讲述了Python中函数的用法,分享给大家供大家参考借鉴之用.具体如下: 我们都知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需 ...

  7. 详解python中的用法_详解python中*号的用法

    1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ')*time) T('hi',3) 打印结果(打印3次): hi hi hi 3.单个 * (1) ...

  8. python中 str.strip()用法

    python中 str.strip()用法 1.描述 str.strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. (即可以去除特殊字符串) 注意:该方法只能删除开头或是 ...

  9. pythonnamedtuple定义类型_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

最新文章

  1. 【ACM】杭电OJ 2020(排序)
  2. 15年经验分享:40个改变编程技能的小技巧
  3. 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)
  4. tensorflow电子书(附下载链接)
  5. 还不知道BeanFactory和ApplicationContext的区别?
  6. Qt数据库操作(三) -- 使用SQL模型类
  7. boost::alignment_of相关的测试程序
  8. 学习android 画板源代码,Android实现画画板案例
  9. 让你的创业失败的18个昏招 都归结到这里
  10. python是动态还是静态_python之静态方法和动态方法介绍
  11. 可怕!你没看错,这次确实是纯手工实现一个MyBatis框架!
  12. Android ListView上拉获取下一页
  13. oppo电视怎么看电视台 oppo电视看CCTV直播方法
  14. 移植vsftpd FTP服务器到ARM-Linux系统
  15. 两平面平行但不重合的条件是_____黑龙江省大庆外国语学校高中数学_第二章《2.2_直线、平面平行的判定及其性质》单元测试5_新人教A版必修3...
  16. 多次办理这项公积金业务都涉及到查询信用报告,是否会影响将来申请贷款?
  17. OVERLAPPED结构体类型介绍及作用
  18. java版能播flac_Java中如何写FLAC文件实例
  19. 自己写的C盘清理工具 Ver1.0.0
  20. LSTM 的几种改进方案

热门文章

  1. 无数据 无网络view
  2. c#怎么连接MySQL
  3. Anaconda 安装及使用
  4. 自编码器的原理及实现
  5. 智能优化与机器学习结合算法实现时序数据预测matlab代码清单
  6. 新上线的“闪电”算法
  7. Hadoop入门概念
  8. 前端面试题集锦——前端综合问题
  9. word里表格断页怎么办?(如何处理word里面表格断页问题)【知足且坚定,温柔且上进---两牛博客】
  10. 2018安卓面试经历