5.3.5 namedtuple() 创建命名字段的元组结构
在命名元组里。给每一个元组的位置加入一个名称,而且能够通过名称来訪问。大大地提高可读性,以便写出清晰代码,提高代码的维护性。事实上它就像C++里的结构体。
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个新类型名称typenname的元组。參数field_names是一个字串表示的元素名称,每一个字段之间能够通过空格、逗号方式来分隔,比方’x y’,’x, y’。
另外也能够採用列表的方式,比方[‘x’, ‘y’]。在字段名称命名上须要注意的是每一个字段要是有效的python标识符规则,同一时候不能是pythonkeyword。另外不要下面划线或数字开头。
假设參数rename为True就会自己主动地把不合法名称转换为对应合法的名称,比方:['abc', 'def', 'ghi', 'abc']转换为['abc', '_1', 'ghi', '_3'],在这里把def转换_1,同一时候把反复的abc转换_3。
假设參数verbose为True就会自己主动打印_source属性。
样例:
#python 3.4
import collections
Point = collections.namedtuple('Point', 'x, y, z')
p1 = Point(30, 40, 50)
print(p1)
print(p1[0] + p1[1] + p1[2])
x, y, z = p1
print(x, y, z)
print(p1.x, p1.y, p1.z)
结果输出例如以下:
Point(x=30, y=40, z=50)
120
30 40 50
30 40 50
classmethod somenamedtuple._make(iterable)
从已经存在迭代对象或者序列生成一个新的命名元组。
样例:
#python 3.4
import collections
Point = collections.namedtuple('Point', 'x, y, z')
t = [10, 20, 30]
p1 = Point._make(t)
print(p1)
结果输出例如以下:
Point(x=10, y=20, z=30)
somenamedtuple._asdict()
把命名元组生成一个新的OrderedDict对象返回,能够使用内置函数vars()实现对应的功能。
样例:
#python 3.4
import collections
Point = collections.namedtuple('Point', 'x, y, z')
t = [10, 20, 30]
p1 = Point._make(t)
print(p1._asdict())
print(vars(p1))
结果输出例如以下:
OrderedDict([('x', 10), ('y', 20), ('z', 30)])
OrderedDict([('x', 10), ('y', 20), ('z', 30)])
somenamedtuple._replace(kwargs)
对指定的字段的值进行替换。并返回新的命名元组。
样例:
#python 3.4
import collections
Point = collections.namedtuple('Point', 'x, y, z')
t = [10, 20, 30]
p1 = Point._make(t)
print(p1._replace(x=100))
print(vars(p1))
结果输出例如以下:
Point(x=100, y=20, z=30)
OrderedDict([('x', 10), ('y', 20), ('z', 30)])
somenamedtuple._source
返回创建命名元组相关的python代码字符串。能够把它打印出来,或者使用exec()函数运行。或者输出到文件中,再给别的代码导入。
样例:
#python 3.4
import collections
Point = collections.namedtuple('Point', 'x, y, z')
t = [10, 20, 30]
p1 = Point._make(t)
print(p1._source)
输出结果例如以下:
from builtins import property as _property, tuple as _tuple
from operator import itemgetter as _itemgetter
from collections import OrderedDict
class Point(tuple):
'Point(x, y, z)'
__slots__ = ()
_fields = ('x', 'y', 'z')
def __new__(_cls, x, y, z):
'Create new instance of Point(x, y, z)'
return _tuple.__new__(_cls, (x, y, z))
@classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new Point object from a sequence or iterable'
result = new(cls, iterable)
if len(result) != 3:
raise TypeError('Expected 3 arguments, got %d' % len(result))
return result
def _replace(_self, **kwds):
'Return a new Point object replacing specified fields with new values'
result = _self._make(map(kwds.pop, ('x', 'y', 'z'), _self))
if kwds:
raise ValueError('Got unexpected field names: %r' % list(kwds))
return result
def __repr__(self):
'Return a nicely formatted representation string'
return self.__class__.__name__ + '(x=%r, y=%r, z=%r)' % self
@property
def __dict__(self):
'A new OrderedDict mapping field names to their values'
return OrderedDict(zip(self._fields, self))
def _asdict(self):
'Return a new OrderedDict which maps field names to their values.'
return self.__dict__
def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.'
return tuple(self)
def __getstate__(self):
'Exclude the OrderedDict from pickling'
return None
x = _property(_itemgetter(0), doc='Alias for field number 0')
y = _property(_itemgetter(1), doc='Alias for field number 1')
z = _property(_itemgetter(2), doc='Alias for field number 2')
somenamedtuple._fields
返回命名元组的字段列表。
能够用于从已经创建命名元组组合产生新的元组。
样例:
#python 3.4
import collections
Point = collections.namedtuple('Point', 'x, y, z')
print(Point._fields)
Point4 = collections.namedtuple('Point4', Point._fields + ('w',))
print(Point4, Point4._fields)
结果输出例如以下:
('x', 'y', 'z')
<class '__main__.Point4'> ('x', 'y', 'z', 'w')
使用命名元组从csv文件或者SQLite生成结构体信息保存:
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
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)
从这个样例里。能够看到从csv文件读取之后。就能够函数map的运算。生成一个EmployeeRecord结构体记录了,这样能够把行记录转换对应的结构化的信息。就方便查找,排序等操作。
使用命名元组作为基类继承:
#python 3.4
import collections
class Point(collections.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)
for p in Point(3, 4), Point(14, 5/7):
print(p)
结果输出例如以下:
Point: x= 3.000 y= 4.000 hypot= 5.000
Point: x=14.000 y= 0.714 hypot=14.018
蔡军生 QQ:9073204 深圳
5.3.5 namedtuple() 创建命名字段的元组结构的更多相关文章
- mysql必知必会--创建计算字段
计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式.下面举 几个例子. * 如果想在一个字段中既显示公司名,又显示公司的地址,但这两 个信息一般包含在不同的表列中. * 城市.州和邮政编码存 ...
- sqlServer 2008修改字段类型和重命名字段名称的sql语句
sqlServer 2008修改字段类型和重命名字段名称的sql语句 //修改字段的类型 alter table fdi_news alter column c_author nvarchar(50) ...
- Hibernate 注解 没有加@Column一样会在数据库创建这些字段
Hibernate 注解 没有加@Column一样会在数据库创建这些字段 如下一个注解类: package com.hyy.hibernate.one_to_many.domain; import j ...
- Django之集合函数使用与mysql表的创建特殊字段分析
1. 集合函数的使用场景: -- 单独使用: 不分组, 只查聚合结果 -- 分组使用: 按字段分组, 可查询分组字段与聚合结果 2. 导入聚合函数 from django.db.models impo ...
- JavaScript 如何创建search字段
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SAP不同的产品是如何支持用户创建自定义字段的
我们从SAP CRM,Cloud for Customer(简称C4C)和S/4HANA这三个产品分别来看看. SAP CRM 我们使用所谓的Application Enhancement Tool( ...
- SAP abap 内表增加字段方法,结构复用
1.include data: begin of gth_qamr. include structure qamr. data: kurztext like qamv-kurztext ...
- maven系列之二maven项目的创建和maven项目的结构
maven系列之一简单介绍了maven的基本信息,安装和配置,大家对maven有一个大概的了解,但是在maven项目开发中远远不够,为了进一步了解maven,现在我们介绍maven项目的创建和mave ...
- linux mysql-workbench 创建与正式库表结构一样的表
先在本地创建数据库 字符集选择这个 创建数据库成功 创建与正式库一样的表 step1: 连接正式库,找到要生成的表,导出创建表的sql语句 step2: 找到本地数据库,选择表,在sql执行区域复制s ...
随机推荐
- OpenFace Docker 使用简介
在Docker中使用openface最大的问题是数据与主机的交互,下面我介绍几种方法来实现主机与Docker容器的数据交互. 1.第一种也是最方便的一种方法是在进入容器时使用-v参数将主机的目录挂载到 ...
- iframe是否缓存页面探究
近期手里有个项目须要用iframe来调用每天都会变化的页面,后来想到iframe会不会缓存页面呢.于是写了个demo论证了下,结果例如以下: iframe的src假设是静态页面,就有可能会缓存.由于静 ...
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十一章 属性
11.1 使用属性值 @property float rainHandling; //表明此类具有float类型的属性,其名称为rainHandling 注意:属性的名称不必与实例变量名称同样. @s ...
- 使用dbms_metadata.get_ddl遇到ORA-31603
建了一个外部表,想看看这个表的信息,一查就报错了: SQL> select dbms_metadata.get_ddl('TABLE','ext_case1') from dual; ERROR ...
- Node.js:连接 MongoDB
ylbtech-Node.js:连接 MongoDB 1.返回顶部 1. Node.js 连接 MongoDB MongoDB是一种文档导向数据库管理系统,由C++撰写而成. 本章节我们将为大家介绍如 ...
- [Java]serialVersionUID的作用
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的 字节流中的serialVersionUID与本地相应实体(类 ...
- ITWorld:2014年全球最杰出的14位编程天才
近日,ITWorld 整理全球最杰出的 14 位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后) 1.Jon Skeet 个人名望:程序技术问答网站 Stack Overflow 总排 ...
- python 一句话输出26个英文字母
chr(i) # return i character ord(c) # return integer >>> [chr(i) for i in range(97,123)] ['a ...
- offscreen-render
offscreen-render 什么是offscreen-render?offscreen-render涉及的内容比较多,有offscreen-render那就有onscreen render,on ...
- JS面向对像编程四—— prototype 对象
http://blog.csdn.net/fanwenjieok/article/details/54575560 大部分面向对象的编程语言,都是以“类”(class)作为对象体系的语法基础.Java ...