1. 概述

namedtuple译作具名元组或命名元组
具名元组可以理解为元组的增强版本,它适用于任何普通元组的应用范围。
具名元组为元组中的每个元素都赋予了含义,从而增强代码可读性,能够让程序员写出自文档化 self-documenting 的代码。

2. namedtuple() 定义与参数

namedtuple() 工厂函数返回一个具名元组类,该函数位于 collections 模块下,具体定义形式如下:

namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

2.1 typename 参数

namedtuple 返回一个元组的子类(即具名元组类),类名为 typename。
通过具名元组类创建出来的具名元组对象,其内部元素支持属性查找(点号语法)、索引操作(方括号语法),并且是可迭代的。
具名元组对象还有自动生成的文档字符串,和一个 __repr__() 方法,把具名元组对象展示为 name=value 的格式。
下面是一小段示例代码:

from collections import namedtupleStudent = namedtuple('Student', 'name, gender')
s = Student('小花', '女')# 属性访问
print(s.name)
print(s.gender)
"""
小花
女
"""# 索引取值
print(s[0])
print(s[1])
"""
小花
女
"""# 可迭代
for i in s:print(i)
"""
小花
女
"""# docstring
print(s.__doc__)
"""
Student(name, gender)
"""# repr
print(repr(s))
"""
Student(name='小花', gender='女')
"""

2.2 field_names 参数

field_names 是具名元组的字段名。
它可以通过两种形式指定:

字符串组成的序列
比如 ['x', 'y']、('x', 'y')。

一个长字符串,各个字段名之间用空格或逗号分隔
比如 'x y' 或者 'x, y'

字段名必须符合以下规则:

以字母开头
由字母、数字、下划线组成
不能与关键字重名
不能以下划线开头

2.3 rename 参数

rename 默认为 False,它是只能以关键字形式指定的参数,或者叫做强制关键字参数 keyword-only argument。
如果 rename=True,如果遇到Python关键字或者有重复元素名时,自动进行重命名。
比如 ['abc', 'def', 'ghi', 'abc'] 会被转换成 ['abc', '_1', 'ghi', '_3']。其中与关键字重名的 'def' 和重复的 'abc' 都被替换成了 '_索引值'。

2.4 defaults 参数

defaults 参数默认为 None,是强制关键字参数。
它可以被设置为可迭代对象。
由于默认值参数必须在非默认值参数之后,所以 defaults 参数会被设置给最右边的字段名。
比如字段名为 'x, y, z',defaults 参数为 (1, 2) 时,y 默认为 1,z 默认为 2,x 则没有默认值。

2.5 module 参数

如果定义了 __module__ 的值,那么具名元组类的 __module__ 属性就会被设置为该值。

补充
__module__ 属性记录类定义的位置,如果定义的位置正好是主程序,那么该值为 '__main__',否则是类所属模块的名字。

2.6 补充和历代版本变化

具名元组对象是轻量级的,它们消耗的内存与普通元组一样,因为它们不会对每个实例都维护一个属性字典。

3.1:增加了 rename 参数
3.6:verbose 和 rename 参数变成强制关键字参数
3.6:增加了 module 参数
3.7:去除了 verbose 参数和 _source 属性
3.7:加入了 defaults 参数和 _field_defaults 属性

3. 具名元组的方法和属性

3.1 简单示例

from collections import namedtuple# 简单示例
Point = namedtuple('Point', ['x', 'y'])# 通过位置参数或者关键字参数实例化
p = Point(11, y=22)# 索引取值
print(p[0] + p[1])
"""
33
"""# 像普通元组一样解包
x, y = p
print(x, y)
"""
11 22
"""# 通过名字访问字段
print(p.x + p.y)
"""
33
"""# __repr__ 展现为 name=value
print(repr(p))
"""
Point(x=11, y=22)
"""

3.2 _make 方法

除了从元组继承来的方法和属性,具名元组自己还有三个方法和两个属性。
为了避免与字段名重名,这些方法和属性都以一个下划线开头,这也是为什么字段名不能以下划线开头的原因。

classmethod somenamedtuple._make(iterable)

从序列或者可迭代对象实例化一个具名元组
t = [11, 22]
print(Point._make(t))
"""
Point(x=11, y=22)
"""

3.3 _asdict 方法

somenamedtuple._asdict()
返回一个 OrderedDict 有序字典对象,把字段名映射到相应的值。p = Point(11, 22)
print(p._asdict())
"""
OrderedDict([('x', 11), ('y', 22)])
"""

3.1 版本开始返回 OrderedDict 对象而不是普通字典对象。

3.4 _replace 方法

somenamedtuple._replace(**kwargs)

_replace 接收关键字参数,给指定的字段重新赋值
不改变原来的具名元组,而是会返回一个新的具名元组

p = Point(11, 22)
# _replace 不改变原具名元组!
new_p = p._replace(x=33)
print(p)
print(new_p)
"""
Point(x=11, y=22)
Point(x=33, y=22)
"""

3.5 _fields 属性

somenamedtuple._fields
该属性是由字段名组成的元组。
在内省 introspection 时和从现有的字段名创建新的具名元组类型时很好用。

# 查看具名元组的字段
print(p._fields)
"""
('x', 'y')
"""Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)
p = Pixel(11, 22, 128, 255, 0)
print(p)
"""
Pixel(x=11, y=22, red=128, green=255, blue=0)
"""

3.7 _fields_defaults 属性

somenamedtuple._fields_defaults
返回一个字典,是字段名和默认值的映射。

Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
print(Account._fields_defaults)
"""
{'balance': 0}
"""
print(Account('premium'))
"""
Account(type='premium', balance=0)
"""

3.8 补充用法

使用 getattr 获取属性
# 使用 getattr 获取属性
print(getattr(p, 'x'))
"""
11
"""
用字典生成具名元组
# 解包字典作为参数生成具名元组
# 相当于以关键字形式指定的参数
d = {'x': 11, 'y': 22}
p = Point(**d)
print(p)
"""
Point(x=11, y=22)
"""
其它用法比如子类化具名元组另行记述。

namedtuple 具名元组详解相关推荐

  1. Python 3.7.1 中 namedtuple 具名元组基本用法详解

    Python 3.7.1 中 namedtuple 具名元组基本用法详解 转载请注明出处:https://blog.csdn.net/jpch89/article/details/84645251 文 ...

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

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

  3. python元组的定义方式_序列之元组详解

    元组是序列一种,与列表类似,但是不能修改,下面我们详解介绍下元组: 1 列表近亲:元组 1.1 元组定义与访问方式: 元组与列表类似,元组语法:(ele1, ele2, ele3):具体如下: #定义 ...

  4. python中namedtuple函数用法详解

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

  5. Python namedtuple ——具名元组

    本文主要介绍namedtuple类型对象的创建以及对应属性的访问. namedtuple位于Python内置模块collections,属于tuple子类,类似于C/C++中的struct结构体,na ...

  6. python中的列表分片详解_python列表与元组详解实例

    在这章中引入了数据结构的概念.数据结构是通过某种方式组织在一起的数据元素的集合.在python中,最基本的数据结构就是序列.序列中的每个元素被分配一个序号,即元素的位置,也被称为索引.注意:第一个索引 ...

  7. 数据结构当中的二元组详解

    1.今天做题遇到这样一道题目: 那我们下面来具体讲一下其中的关系 2.什么是数据结构: 数据结构分为:逻辑结构.存储结构. A.逻辑结构分为:集合.线性结构.树形结构.图形结构.     --线性表. ...

  8. python namedtuple (命名元组)用法详解

    Python元组的升级版本 – namedtuple(具名元组) 因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以在这里引入了 collections. ...

  9. python内置序列类型_Python序列内置类型之元组类型详解

    Python序列内置类型之元组类型详解 1.元祖的概念 Python中的元组与列表类似,都是一个序列,不同的是元组的元素不能修改而已. 2.元组的创建 元组使用小括号,列表使用方括号. tup = ( ...

最新文章

  1. 新 IDE 出现,程序员迎来危机?
  2. CentOS7 设置开机直接进入命令行界面
  3. C# 系统应用之ListView实现简单图片浏览器
  4. java string转jsonobject_超赞!终于有网友用Java实现了第三方qq账号登录
  5. cycleGAN的改进文章(CyCADA + U-GAT-IT)
  6. shell开启飞行模式_手机飞行模式有什么用 手机飞行模式介绍【详解】
  7. Gradle打可运行Jar包(包含依赖第三方库中的类)
  8. 周二强新概念c语言答案,新编C语言程序设计(周二强版)课后习题练习4答案
  9. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
  10. 远在美国的凤姐为何选择回国理財?
  11. java算法-递归算法思想
  12. GB28181协议之录像回放
  13. 使用SPSS 进行两组独立样本的t检验、F检验、显著性差异、计算p值
  14. Python 经典例题
  15. 使用busybox制作rootfs
  16. 微信小程序小Demo
  17. 0x80073712_win10更新失败出现错误代码0x80073712如何解决
  18. 企业应用大数据开源框架的意义何在?
  19. python动物书系列电子_晒书名:已收藏O'Reilly出版社‘动物世界’系列图书(二)...
  20. CSSCI中文数据库引文分析+主路径分析+共被引

热门文章

  1. Smiditor实现图片上传功能
  2. 使用D2D出现的错误
  3. VS2013,MFC,在视图类里添加鼠标左键响应函数OnLButtonDown
  4. 微信支付body中文乱码解决方案
  5. html中input中加图片,css怎么在input中插图片
  6. C# 生成带二维表头的Excel表
  7. 云蝠智能与华为云:是伙伴,更是一起逐梦的同路人
  8. 上经 -- 乾【卦一】乾为天(一)
  9. alert 弹出框的操作
  10. Openwrt无线中继设置并访问外网