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

namedtuple:

namedtuple类位于collections模块,有了namedtuple后通过属性访问数据能够让我们的代码更加的直观更好维护。

namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代,还能够方便的通过属性名来访问数据。

接下来通过本文给大家分享python namedtuple()的使用,一起看看吧!

基本定义

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

(1)返回一个名为typename的新元组子类

(2)新的子类用于创建类似元组的对象,这些对象具有可通过属性查找访问的字段以及可索引和可​​迭代的字段field_names

typename

(1)typename表示这个子类的名字,比如C++、python、Java中的类名

field_names

(1)field_names是一个字符串序列,例如['x','y']

(2)field_names可以是单个字符串,每个字段名都用空格或逗号分隔,例如'x y'或'x,y'

others

(1)其它的参数并不常用,这里不再介绍啦

基本样例

from collections import namedtuple

# 基本例子

Point = namedtuple('Point',['x','y']) # 类名为Point,属性有'x'和'y'

p = Point(11, y=22) # 用位置或关键字参数实例化,因为'x'在'y'前,所以x=11,和函数参数赋值一样的

print(p[0]+p[1]) # 我们也可以使用下标来访问

# 33

x, y = p # 也可以像一个元组那样解析

print(x,y)

# (11, 22)

print(p.x+p.y) # 也可以通过属性名来访问

# 33

print(p) # 通过内置的__repr__函数,显示该对象的信息

# Point(x=11, y=22)

classmethodsomenamedtuple._make(iterable)

(1)从一个序列或者可迭代对象中直接对field_names中的属性直接赋值,返回一个对象

t = [11, 22] # 列表 list

p = Point._make(t) # 从列表中直接赋值,返回对象

print(Point(x=11, y=22))

# Point(x=11, y=22)

classmethodsomenamedtuple._asdict()

(1)之前也说过了,说它是元组,感觉更像一个带名字的字典

(2)我们也可以直接使用_asdict()将它解析为一个字典dict

p = Point(x=11, y=22) # 新建一个对象

d = p._asdict() # 解析并返回一个字典对象

print(d)

# {'x': 11, 'y': 22}

classmethodsomenamedtuple._replace(**kwargs)

(1)这是对某些属性的值,进行修改的,从replace这个单词就可以看出来

(2)注意该函数返回的是一个新的对象,而不是对原始对象进行修改

p = Point(x=11, y=22) # x=11,y=22

print(p)

# Point(x=11, y=22)

d = p._replace(x=33) # x=33,y=22 新的对象

print(p)

# Point(x=11, y=22)

print(d)

# Point(x=33, y=22)

classmethodsomenamedtuple._fields

(1)该方法返回该对象的所有属性名,以元组的形式

(2)因为是元组,因此支持加法操作

print(p._fields) # 查看属性名

# ('x', 'y')

Color = namedtuple('Color', 'red green blue')

Pixel = namedtuple('Pixel', Point._fields + Color._fields) # 新建一个子类,使用多个属性名

q = Pixel(11, 22, 128, 255, 0)

print(q)

classmethodsomenamedtuple._field_defaults

(1)该方法是python3.8新增的函数,因为我的版本是3.6,无法验证其正确性

(2)下面给出官方的示例

Account = namedtuple('Account', ['type', 'balance'], defaults=[0])

print(Account._field_defaults)

#{'balance': 0}

print(Account('premium'))

#Account(type='premium', balance=0)

getattr()函数

(1)用来获得属性的值

print(getattr(p, 'x'))

# 11

字典创建namedtuple()

(1)从字典来构建namedtuple的对象

d = {'x': 11, 'y': 22} # 字典

p = Point(**d) # 双星号是重点

print(p)

# Point(x=11, y=22)

CSV OR Sqlite3

(1)同样可以将从csv文件或者数据库中读取的文件存储到namedtuple中

(2)这里每次存的都是一行的内容

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv

for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "r"))):

# 这里每行返回一个对象 注意!

print(emp.name, emp.title)

import sqlite3

conn = sqlite3.connect('/companydata') # 连接数据库

cursor = conn.cursor()

cursor.execute('SELECT name, age, title, department, paygrade FROM employees')

for emp in map(EmployeeRecord._make, cursor.fetchall()):

# 每行返回一个对象 注意!

print(emp.name, emp.title)

类的继承

(1)接下来用deepmind的开源项目graph_nets中的一段代码来介绍

NODES = "nodes"

EDGES = "edges"

RECEIVERS = "receivers"

SENDERS = "senders"

GLOBALS = "globals"

N_NODE = "n_node"

N_EDGE = "n_edge"

GRAPH_DATA_FIELDS = (NODES, EDGES, RECEIVERS, SENDERS, GLOBALS)

GRAPH_NUMBER_FIELDS = (N_NODE, N_EDGE)

class GraphsTuple(

# 定义元组子类名 以及字典形式的键名(属性名)

collections.namedtuple("GraphsTuple",

GRAPH_DATA_FIELDS + GRAPH_NUMBER_FIELDS)):

# 这个函数用来判断依赖是否满足,和我们的namedtuple关系不大

def _validate_none_fields(self):

"""Asserts that the set of `None` fields in the instance is valid."""

if self.n_node is None:

raise ValueError("Field `n_node` cannot be None")

if self.n_edge is None:

raise ValueError("Field `n_edge` cannot be None")

if self.receivers is None and self.senders is not None:

raise ValueError(

"Field `senders` must be None as field `receivers` is None")

if self.senders is None and self.receivers is not None:

raise ValueError(

"Field `receivers` must be None as field `senders` is None")

if self.receivers is None and self.edges is not None:

raise ValueError(

"Field `edges` must be None as field `receivers` and `senders` are "

"None")

# 用来初始化一些参数 不是重点

def __init__(self, *args, **kwargs):

del args, kwargs

# The fields of a `namedtuple` are filled in the `__new__` method.

# `__init__` does not accept parameters.

super(GraphsTuple, self).__init__()

self._validate_none_fields()

# 这就用到了_replace()函数,注意只要修改了属性值

# 那么就返回一个新的对象

def replace(self, **kwargs):

output = self._replace(**kwargs) # 返回一个新的实例

output._validate_none_fields() # pylint: disable=protected-access 验证返回的新实例是否满足要求

return output

# 这是为了针对tensorflow1版本的函数

# 返回一个拥有相同属性的对象,但是它的属性值是输入的大小和类型

def map(self, field_fn, fields=GRAPH_FEATURE_FIELDS): # 对每个键应用函数

"""Applies `field_fn` to the fields `fields` of the instance.

`field_fn` is applied exactly once per field in `fields`. The result must

satisfy the `GraphsTuple` requirement w.r.t. `None` fields, i.e. the

`SENDERS` cannot be `None` if the `EDGES` or `RECEIVERS` are not `None`,

etc.

Args:

field_fn: A callable that take a single argument.

fields: (iterable of `str`). An iterable of the fields to apply

`field_fn` to.

Returns:

A copy of the instance, with the fields in `fields` replaced by the result

of applying `field_fn` to them.

"""

return self.replace(**{k: field_fn(getattr(self, k)) for k in fields}) # getattr(self, k) 获取的是键值对中的值, k表示键

到此这篇关于详解Python中namedtuple的使用的文章就介绍到这了,更多相关python namedtuple的使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: 详解Python中namedtuple的使用

本文地址: http://www.cppcns.com/jiaoben/python/310459.html

pythonnamedtuple定义类型_详解Python中namedtuple的使用相关推荐

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

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

  2. python中heapq的库是什么_详解Python中heapq模块的用法

    详解Python中heapq模块的用法 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  详解Python中heapq模块的用法.txt ] (友情提示:右键点上行t ...

  3. python停止线程池_详解python中Threadpool线程池任务终止示例代码

    需求 加入我们需要处理一串个位数(0~9),奇数时需要循环打印它:偶数则等待对应时长并完成所有任务:0则是错误,但不需要终止任务,可以自定义一些处理. 关键点 定义func函数处理需求 callbac ...

  4. python中index函数_详解python中的index函数用法

    1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...

  5. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  6. python xlrd安装_详解python中xlrd包的安装与处理Excel表格

    一.安装xlrd 地址 下载后,使用 pip install .whl安装即好. 查看帮助: >>> import xlrd >>> help(xlrd) Help ...

  7. python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂

    一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...

  8. python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...

  9. python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发

    strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...

最新文章

  1. Spring的AOP理解
  2. Python数据结构学习笔记——栈
  3. 安装VMware tools
  4. matlab里面连接器是什么,连接器
  5. Pascal数据结构与算法
  6. icem二维非结构网格划分_“白皮书”系列No.26——科研小工具之ICEM
  7. 为什么在12306买火车票要装根证书?
  8. Hive常用命令之MSCK REPAIR TABLE命令概述
  9. 使命召唤4:现代战争
  10. 网页端调用客户端的cs 程序
  11. 网络信息检索(一)检索模型:布尔,向量,概率检索
  12. USYD悉尼大学DATA1002 详细作业解析Module3
  13. 常微分方程组之龙格-库塔法
  14. YuKimCai——Linux(centos操作系统)挂盘记录
  15. 你只要上传两张毫无关联的照片「这个网站就会自动帮你合成了!」
  16. hdmi转lvds驱动方案。 输入支持vga,hdmi,av,输出支持lvds单通道和双通道
  17. 对张楚汉院士混凝土动力性能研究报告的笔记
  18. 黑客攻陷Okta发动供应链攻击,影响130多家组织机构
  19. 【转载】 Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
  20. 4.6.2 万能转换器boost::lexical_cast

热门文章

  1. 完善Linux/UNIX审计 将每个shell命令记入日志
  2. 4kyu Path Finder #2: shortest path
  3. are exo exo是什么歌 we_are exo exo是什么歌 we_EXO we are one
  4. python中判断列表数据类型_浅谈Python数据类型判断及列表脚本操作
  5. 2018年最实用的6个机器学习项目
  6. Rsync + Sersync 实现数据增量同步
  7. 关于40位MD5加密的破解
  8. Mybatis的xml文件中$ 与 #的区别
  9. 数据仓库、数据湖、流批一体,终于有大神讲清楚了!
  10. 研究了 2 天,终于知道 JDK 8 默认 GC 收集器了!