1、namedtuple

tuple是不可变序列,当你不希望外界可以随意的改变你的函数返回值的时候,不妨将你的返回值以tuple的形式返回,tuple还可以做为字典的key,这些都是tuple的独到之处,此外,由于存储的方式不同,相同元素的tuple 要比list更快,使用的内存更少。

tuple虽然有这么多优点,但是呢,在使用的时候,你不得不用下角标来访问它的元素,这样对于代码的可读性来说是一种折损。

namedtuple弥补了tuple的这一缺陷,使得你可以像使用对象属性那样去访问数据

2、示例

2.1 代码

# coding=utf-8

from collections import namedtuple

Book = namedtuple('Book', ['name', 'price', 'count'])

book1 = Book(name='python', price=100.0, count=10)

print book1

print book1.name

print book1.price

print book1.count

2.2  如何创建

在上面的这段代码中,首先定义了一个namedtuple,第一个参数指定了它的类型,第二个参数则指定了字段名称,第二个参数除了写成list的形式,还可以写成字符串的形式,以空格分割,例如

Book = namedtuple('Book', 'name price count')

2.3 属性不可改变

如果你试图改变book1对象的某个属性,程序会直接报错的,因为它是一个特殊的tuple

2.4 更便捷的赋值过程

对于上面代码中的属性赋值过程,你可能会感到有些为难,因为如果字段特别多,那么一个一个的写代码去赋值就变得非常繁琐,如果你手里拥有的数据是一个字典,那么还可以这样去创始化它

book_dict = {

'name': 'c++',

'price': 99,

'count': 10

}

book2 = Book(**book_dict)

print book2

3、 namedtuple究竟是什么

不妨先打印一下Book

print Book

得到的结果是

这说明, namedtuple('Book', 'name price count')  返回的是一个类,Book恰好是我们传入的第一个参数,你可以将第一个参数修改成其他单词,然后再打印观察效果就会明白,第一个参数定义的是类的名字

深入namedtuple  的实现一探究竟

在 collections.py 文件中的293行开始,是对namedtuple的定义,注意看 356行的  class_definition  和  374 行的 exec class_definition in namespace

356行都是对属性的处理,356行,将这些数据整合成一个字符串,374行则对这个字符串进行了执行,或者说编译,得到的就是一个类

那么这个类又是如何生成的呢?

293行定义了类的模板

_class_template = '''\

class {typename}(tuple):

'{typename}({arg_list})'

__slots__ = ()

_fields = {field_names!r}

def __new__(_cls, {arg_list}):

'Create new instance of {typename}({arg_list})'

return _tuple.__new__(_cls, ({arg_list}))

@classmethod

def _make(cls, iterable, new=tuple.__new__, len=len):

'Make a new {typename} object from a sequence or iterable'

result = new(cls, iterable)

if len(result) != {num_fields:d}:

raise TypeError('Expected {num_fields:d} arguments, got %d' % len(result))

return result

def __repr__(self):

'Return a nicely formatted representation string'

return '{typename}({repr_fmt})' % 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 {typename} object replacing specified fields with new values'

result = _self._make(map(kwds.pop, {field_names!r}, _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

{field_defs}

'''

这正是奥妙所在,nametuple根据我们传入的两个参数,格式化了这段字符串,然后exec 这段字符串,就生成了一个类,这个类继承了tuple,而后,我们用这个类创建对象

python class namedtuple 效率_菜鸟世界 -python进阶之 namedtuple相关推荐

  1. python数据分析相关论文_菜鸟学Python|数据分析精华文章大集合

    原标题:菜鸟学Python|数据分析精华文章大集合 这是菜鸟学Python的第123篇原创文章 Python的数据分析是我比较喜欢的一个方向,因为可以探索数据里面的秘密,加上可视乎会非常漂亮,但是里面 ...

  2. python encoding报错_菜鸟世界 -docker 环境下解决python 的 UnicodeEncodeError 错误

    1. 问题描述 使用docker部署python的web服务,框架使用flask,服务部署以后进行测试,服务端报出UnicodeEncodeError 我用的python版本是3.6,按理说,对字符编 ...

  3. python经典类新式类_菜鸟世界 -python进阶---新式类与经典类

    1.什么是新式类,什么是经典类 #coding=utf-8 class A: pass class B(object): pass A是经典类,B是新式类,这是Python2.x 里所特有的现象,之所 ...

  4. python调用有道词典_菜鸟上手Python最有野心的库Asyncio

    Asyncio是Python中非常牛逼的一个异步并发库,比较复杂不太好理解!从Py3.4之后开始加入这个内置并发库,一举解决了Python中高并发的问题.它提供了一整套异步IO模型的编程接口,可以说它 ...

  5. python xlwings追加数据_大数据分析Python库xlwings提升Excel工作效率教程

    原标题:大数据分析Python库xlwings提升Excel工作效率教程 Excel在当今的企业中非常非常普遍.在AAA教育,我们通常建议出于很多原因使用代码,并且我们的许多数据科学课程旨在教授数据分 ...

  6. python天气查询运行过程_菜鸟玩Python|制作天气查询软件

    原标题:菜鸟玩Python|制作天气查询软件 开发环境 Python3 PyQt5 requests 准备工作 首先要获取不同城市对应的天气代码,可以从 https://www.heweather.c ...

  7. python 一亩三分地_攻防世界逆向新手训练

    本来是搞Web的(虽然菜的抠脚),但是战队缺reverse和pwn的人,正好自己对这方面也很有兴趣,于是就转了方向.刚学几天,先做上几道攻防世界的新手训练题.把自己做题的过程和学到的知识记录下来.由于 ...

  8. python相关工作岗位_西安掌握Python有哪些工作岗位能够选择

    自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python已经成为备受欢迎的程序设计语言之一. 大家或许更想知道学完Python后,都可以有哪些发展方 ...

  9. python变量定义大全_详解python变量与数据类型

    这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...

最新文章

  1. php artisan常用方法
  2. QCustomplot控件设备背景图片(Qt图片自适应控件大小),并且设置绘图区域颜色透明
  3. git bash 操作文件及文件夹命令
  4. PHP获取用户地址方法
  5. java join yield_java中join和yield有什么区别?
  6. 科沃斯机器人阿尔法怎么样_科沃斯阿尔法扫地机器人,实用的才是最好的
  7. 双十一要来了,设计没思路看看案例
  8. php insert方法,lInsert 命令/方法/函数
  9. 将 30 万行代码从 Flow 迁移到 TypeScript 是一种怎样的体验?
  10. 高级Linux Kernel Inline Hook技术分析与实现
  11. 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
  12. 利用vbs读取XML中的某个指定子叶节点 (转)
  13. mysql各种key_SQL中的各种键
  14. 金蝶KIS专业版13.0视频教程
  15. 和秋叶一起学Excel 阿里云盘
  16. 自动驾驶汽车技术介绍【硬件+软件】
  17. 把VOB格式转换成其它格式的工具
  18. RLC电阻电容电感基础知识——电容篇
  19. 小猫爪:嵌入式小知识10-I2S,TDM,PCM等音频格式详解
  20. 免费OCR图片文字识别小工具,一键提取图片中文字,支持多语言翻译和发票识别

热门文章

  1. Handlebars的使用方法及技巧
  2. C++长整型(long long)64位整型耗时问题
  3. AppleScript 小试牛刀
  4. 【网络编程】大端模式和小端模式
  5. 看不到 虚拟打印机 adobe pdf printer
  6. 整理了70个Python实战项目案例,教程+源码+笔记。从基础到深入
  7. uoj #213.【UNR #1】争夺圣杯 单调栈
  8. 一位3年测试工程师的焦虑:月薪还不到3W,真的很担心被后面的小年轻挤掉......
  9. 微信小程序实现蓝牙打印(图片、二维码、文字)
  10. 支付宝小程引入 SJS