Python namedtuple(命名元组)使用实例

#!/usr/bin/python3

import collections

MyTupleClass = collections.namedtuple('MyTupleClass',['name', 'age', 'job'])
obj = MyTupleClass("Tomsom",12,'Cooker')
print(obj.name)
print(obj.age)
print(obj.job)

执行结果:

Tomsom
12
Cooker

namedtuple对象就如它的名字说定义的那样,你可以给tuple命名,具体看下面的例子:

#!/usr/bin/python3

import collections

Person=collections.namedtuple('Person','name age gender')
print( 'Type of Person:',type(Person))
Bob=Person(name='Bob',age=30,gender='male')
print( 'Representation:',Bob)
Jane=Person(name='Jane',age=29,gender='female')
print( 'Field by Name:',Jane.name)
for people in [Bob,Jane]:
print ("%s is %d years old %s" % people)

执行结果:

Type of Person: <class 'type'>
Representation: Person(name='Bob', age=30, gender='male')
Field by Name: Jane
Bob is 30 years old male
Jane is 29 years old female

  来解释一下nametuple的几个参数,以Person=collections.namedtuple(‘Person’,'name age gender’)为例,其中’Person’是这个namedtuple的名称,后面的’name age gender’这个字符串中三个用空格隔开的字符告诉我们,我们的这个namedtuple有三个元素,分别名为name,age和gender。我们在 创建它的时候可以通过Bob=Person(name=’Bob’,age=30,gender=’male’)这种方式,这类似于Python中类对象 的使用。而且,我们也可以像访问类对象的属性那样使用Jane.name这种方式访问namedtuple的元素。其输出结果如下:

  但是在使用namedtyuple的时候要注意其中的名称不能使用Python的关键字,如:class def等;而且也不能有重复的元素名称,比如:不能有两个’age age’。如果出现这些情况,程序会报错。但是,在实际使用的时候可能无法避免这种情况,比如:可能我们的元素名称是从数据库里读出来的记录,这样很难保 证一定不会出现Python关键字。这种情况下的解决办法是将namedtuple的重命名模式打开,这样如果遇到Python关键字或者有重复元素名 时,自动进行重命名。

看下面的代码:

import collections
with_class=collections.namedtuple('Person','name age class gender',rename=True)
print with_class._fields
two_ages=collections.namedtuple('Person','name age gender age',rename=True)
print two_ages._fields

其输出结果为:

('name', 'age', '_2', 'gender')
('name', 'age', 'gender', '_3')

  我们使用rename=True的方式打开重命名选项。可以看到第一个集合中的class被重命名为 ‘_2' ; 第二个集合中重复的age被重命名为 ‘_3'这是因为namedtuple在重命名的时候使用了下划线 _ 加元素所在索引数的方式进行重命名。

附两段官方文档代码实例:

1) namedtuple基本用法

>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
>>> p[0] + p[1] # indexable like the plain tuple (11, 22)
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessible by name
33
>>> p # readable __repr__ with a name=value style
Point(x=11, y=22)

2) namedtuple结合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)

最新文章

  1. xss其他标签下的js用法总结大全
  2. iOS-数据持久化基础-沙盒机制
  3. 项目管理学习笔记之五.沟通协调能力I
  4. UNIX环境高级编程--10. 信号
  5. MongoDB中的高级查询(二)
  6. 【转】成功在AMD主机上用虚拟机安装原版雪豹
  7. R语言 数据的输入方式总结
  8. 实现自己的脚本语言ngscript之零
  9. jsp页面适应手机页面
  10. C# Best Practices - Building Good Classes
  11. HDU 1269 迷宫城堡(强连通)
  12. 如果将Joomla网站搜索结果显示到一个“干净”页面
  13. Leetcode_228_Summary Ranges
  14. 小tips:node起一个简单服务,打开本地项目或文件浏览
  15. rest service下载文件与上传
  16. hiho1460 rmq模板题
  17. (转载)Java多线程返回值处理
  18. 0_Simple__vectorAdd + 0_Simple__vectorAdd_nvrtc + 0_Simple__vectorAddDrv
  19. Oauth2.0协议曝漏洞 大量社交网站隐私或遭泄露
  20. I帧、B帧、P帧、NALU类型

热门文章

  1. nginx里面的rewrite配置
  2. 重载&lt;&lt;操作符
  3. Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成
  4. 【洛谷P1948】[USACO08JAN]电话线
  5. 一步步做程序优化-讲一个用于OpenACC优化的程序(转载)
  6. 1、SpringBoot+MybatisPlus整合
  7. CCS选择器基础
  8. Cluster - HA -keepalived
  9. python中的文件操作小结1
  10. VIM 如何切换buffer