IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python内置模块namedtuple -> 正文阅读

[Python知识库]Python内置模块namedtuple

namedtuple

namedtuple是一个工厂函数,定义在python标准库的collections模块中。

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

返回一个新的元组子类,名为 typename 。这个新的子类用于创建类元组的对象,可以通过字段名来获取属性值,同样也可以通过索引和迭代获取值。子类实例同样有文档字符串(类名和字段名)另外一个有用的 __repr__() 方法,以 name=value 格式列明了元组内容。例如:

from collections import namedtuple
Point = namedtuple('Point', 'x, y, z')              # 创建一个名为Point的元组子类
coordinate = Point(1,2,3)                           # 创建Point子类的对象
print(coordinate.x, coordinate.y, coordinate.z)     # 通过字段名来获取属性值
print(coordinate[0], coordinate[1], coordinate[2])  # 通过索引获取值
it = iter(coordinate)                               # 获取可迭代对象
print(next(it), next(it), next(it))                 # 迭代取值
print(coordinate)                                   # 实现了__repr__方法,以name=value的形式说明了元组内容

参数说明

namedtuple有两个必填参数typename和field_names, 自Python3.6之后rename,defaults,module必须是关键字参数。

typename

参数类型为字符串,切字符串的命名规则和变量的命名规则一致。具名元组返回一个元组子对象,我们要为这个对象命名,所以要传入typename参数。如果要支持封装,应当将命名元组类赋值给一个匹配 typename 的变量,例如Point = namedtuple('Point', 'x, y, z'),变量名和typename名一致。

field_names

field_names 是一个像 [‘x’, ‘y’] 一样的字符串序列。另外 field_names 可以是一个纯字符串,用空白或逗号分隔开元素名,比如 ‘x y’ 或者 ‘x, y’。实际上,field_names的命名规则和变量的命名规则一致

rename

如果 rename 为真,无效字段名会自动转换成位置名。比如 [‘abc’, ‘def’, ‘ghi’, ‘abc’] 转换成 [‘abc’, ‘_1’, ‘ghi’, ‘_3’] , 消除关键词 def 和重复字段名 abc 。

defaults

defaults 可以为 None 或者是一个默认值的 iterable 。如果一个默认值字段跟其他没有默认值的字段在一起出现,defaults 就应用到最右边的参数。比如如果上面的Point有三个字段x, y, z 和默认值 (1, 2) ,那么x就必须指定一个参数值 ,而y和z可以不用指定参数。因为它们具有默认值(y的默认值1 ,z的默认值2)。例如:

Point = namedtuple('Point', 'x, y, z', defaults=(2, 3))
print(Point(1))

module

如果 module 值有定义,命名元组的 module 属性值就被设置。通常无需设置。

namedtuple的方法和属性

除了继承元组的方法,命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始。

_make

@classmethod
def _make(cls, iterable)

_make是类方法,它从存在的序列或迭代实例创建一个新实例。例如:

p1 = Point._make('123')     # 创建一个新实例,参数是可迭代对象即可。
print(p1)

_asdict

def _asdict(self)

返回一个新的 dict ,它将字段名称映射到它们对应的值。例如:p1._asdict().
在 3.1 版更改: 返回一个 OrderedDict 而不是 dict 。
在 3.8 版更改: 返回一个常规 dict 而不是 OrderedDict。 因为自 Python 3.7 起,常规字典已经保证有序(字典中的键是按照插入时的先后顺序排序的)。 如果需要 OrderedDict 的额外特性,推荐的解决方案是将结果转换为需要的类型: OrderedDict(nt._asdict())。

_replace

def _replace(self, /, **kwds)

返回一个新的命名元组实例,并将指定字段替换为新的值。例如:

p1 = Point._make('123')  
print(p1)
print(p1._replace(x=123))   # 将x的值替换为123

_fields

以字符串元组的形式列出字段名。例如:print(p1._fields),输出结果为:

('x', 'y', 'z')

_field_defaults

以字典类型返回字段的默认值。例如:

Point = namedtuple('Point', 'x,y,z', defaults=[0])
print(Point._field_defaults)    # 输出{'z': 0}

字典转为namedtuple

Point = namedtuple('Point', 'x,y,z', defaults=[0])
d = {'x': 11, 'y': 22}
p2 = Point(**d)     # 字典转为namedtuple
print(p2)

通过继承namedtuple来扩展功能

因为一个命名元组是一个正常的Python类,它可以很容易的通过子类更改功能。下面是官方文档的例子。

class Point(namedtuple('Point', 'x,y')):
    __slots__ = ()
    @property
    def hypot(self):
        return (self.x ** 2 + self.y ** 2) ** 0.5
    def __str__(self):
        return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

上面的子类设置 slots 为一个空元组。通过阻止创建实例字典保持了较低的内存开销。子类对于添加和存储新的字段名是无效的。应当通过 _fields 创建一个新的命名元组来实现它,例如:Point3D = namedtuple('Point3D', Point._fields + ('z',))

文档字符串

Python3.5之后文档字符串属性变成可写。例如:

Book = namedtuple('Book', ['id', 'title', 'authors'])
Book.__doc__ += ': Hardcover book in active collection'     # Book这个命名元组的文档字符串
Book.id.__doc__ = '13-digit ISBN'                           # Book类的属性id的文档字符串
Book.title.__doc__ = 'Title of first printing'
Book.authors.__doc__ = 'List of authors sorted by last name'

实际上,namedtuple的源码中,就是文档字符串在后面编写。极大的增加了灵活性,源码如下所示:

@classmethod
def _make(cls, iterable):
    result = tuple_new(cls, iterable)
    if _len(result) != num_fields:
        raise TypeError(f'Expected {num_fields} arguments, got {len(result)}')
    return result

_make.__func__.__doc__ = (f'Make a new {typename} object from a sequence '
                          'or iterable')

为命名元组添加类型提示

在python3.5之后引入了类型提示支持,但是Python 运行时不强制执行函数和变量类型注解,但这些注解可用于类型检查器、IDE、静态检查器等第三方工具。在typing模块中有一个NamedTuple的类,提供了给命名元组添加类型提示的途径。例如:

from typing import NamedTuple
class Point(NamedTuple):
    x:float     # 类型注解
    y:float 
    z:float = 0 # 默认值
p1 = Point(1,2)
print(p1)       # 打印p1
print(p1[0])    # 索引访问
print(p1.x)     # 属性访问

关于更多的内容,可以参考下面给出的Python官方文档。

  1. collections — 容器数据类型
  2. typing — 类型提示支持
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:58:23  更:2022-03-06 13:01:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:36:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码