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

转载请注明出处:https://blog.csdn.net/jpch89/article/details/84645251


文章目录

  • Python 3.7.1 中 namedtuple 具名元组基本用法详解
    • 0. 参考资料
    • 1. 概述
    • 2. namedtuple() 定义与参数
      • 2.1 typename 参数
      • 2.2 field_names 参数
      • 2.3 rename 参数
      • 2.4 defaults 参数
      • 2.5 module 参数
      • 2.6 补充和历代版本变化
    • 3. 具名元组的方法和属性
      • 3.1 简单示例
      • 3.2 _make 方法
      • 3.3 _asdict 方法
      • 3.4 _replace 方法
      • 3.5 _fields 属性
      • 3.7 _fields_defaults 属性
      • 3.8 补充用法

0. 参考资料

  • namedtuple() Factory Function for Tuples with Named Fields
  • Python namedtuple

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,那么无效的字段名会被替换为 '_索引值'
比如 ['abc', 'def', 'ghi', 'abc'] 会被转换成 ['abc', '_1', 'ghi', '_3']。其中与关键字重名的 'def' 和重复的 'abc' 都被替换成了 '_索引值'


2.4 defaults 参数

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


2.5 module 参数

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

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


2.6 补充和历代版本变化

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

3.1:增加了 rename 参数
3.6verboserename 参数变成强制关键字参数
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)
"""

其它用法比如子类化具名元组另行记述。


完成于 2018.11.30

Python 3.7.1 中 namedtuple 具名元组基本用法详解相关推荐

  1. python 元组拆包_Python元组拆包和具名元组解析实例详解

    前言 在Python中元组是一个相较于其他语言比较特别的一个内置序列类型.有些python入门教程把元组成为"不可变的列表",这种说法是不完备的,其并没有完整的概括元组的特点.除了 ...

  2. python中tile的用法_python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  3. python的raw_ input是什么意思-对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  4. python中str和input_对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  5. python3 isinstance用法_对python中assert、isinstance的用法详解

    1. assert 函数说明: Assert statements are a convenient way to insert debugging assertions into a program ...

  6. python中mat函数_Python中flatten( )函数及函数用法详解

    flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列 ...

  7. python post json参数,Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  8. python中seek(10、1)_Python中index()和seek()的用法(详解)

    1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l ...

  9. python中index什么意思_Python中index()和seek()的用法(详解)

    1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l ...

最新文章

  1. 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要
  2. Spring Cloud Alibaba 之 服务通信 REST消息通信:如何使用 OpenFeign 简化服务间通信
  3. IEnumerable和IEnumerator 详解
  4. postgis启动_postgresql的安装和启动方法
  5. Html、Css-----当有文字和图片的时候,需要文字和图片居中,怎么实现?不想文字换行怎么设置...
  6. Spring中实现监听的方法
  7. Application Transport Security has blocked a clear
  8. C++:求第k小的数
  9. mysql root_mysql root 没有任何权限
  10. python数据结构与算法 pdf_数据结构与算法:Python语言描述.pdf
  11. 软件易用性测试怎么做?
  12. 微信发朋友圈功能测试点小结
  13. 管桩的弹性模量计算公式_400管桩单桩水平承载力特征值计算书
  14. 2020李宏毅学习笔记——8. Convolution Netural Network
  15. 基于Mapbox实现地图的样式配置
  16. 北斗三号频点_北斗三号将为手机用户带来更好用户体验
  17. 计算机专业中国十大名校最新排名,中国最顶尖的十所大学 中国十大名校排名...
  18. Work_Day02(2019-10-24)_CFCA电子签章
  19. 计算机二级学校有名单吗,文管二级和计算机二级有啥区别?
  20. Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.int64).

热门文章

  1. 轻松掌握FFmpeg编程:从架构到实践
  2. JavaScript如何合并数组对象中key相同的数据(把数组对象某个属性相同的对象合并成一个新的数组)
  3. 鸿蒙荣耀magic2,赵丽颖晒荣耀Magic2真机 后置三摄值得期待
  4. 职业学校计算机技能标语,技工学校标语
  5. 国产操作系统新突破,中兴新支点OS发布服务器模式
  6. 我的世界手机版制作服务器指令大全,我的世界中国版服务器指令大全 服务器指令汇总...
  7. Github美化日记 - 又菜又爱玩
  8. (自创) 一种新的轻量级文本标记语言 - MarkOwl
  9. 函数重载、函数模板在四轴飞行器中的实际应用
  10. 【JavaScript】Fetch使用说明