极客阿霏

去除头脑里的宗教,偏激,仇恨和鄙视。每一次仇恨一个东西,你就失去了向它学习的机会。

  博客园  :: 首页  :: 新随笔  :: 联系 ::  :: 管理

   Python中的tuple是一个非常高效的集合对象,但是我们只能通过索引的方式访问这个集合中的元素。
比如下面的代码:

1 Bob=('bob',30,'male')  
2 print 'Representation:',Bob  
3 Jane=('Jane',29,'female')  
4 print 'Field by index:',Jane[0]  
5 for people in [Bob,Jane]:  
6 print "%s is %d years old %s" % people

  其中Jane[0]就是通过索引访问的一种方式。
  但是如果tuple中的元素很多的时候操作起来就比较麻烦,有可能会由于索引错误导致出错.
  namedtuple对象就如它的名字说定义的那样,你可以给tuple命名,具体用户看下面的例子:

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 

   来解释一下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的元素。
  其输出结果如下:

Type of Person: <type '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  

  但是在使用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在重命名的时候使用了下划线 _ 加元素所在索引数的方式进行重命名。

posted on 2013-03-16 19:15  阿霏  阅读(751)  评论(0编辑  收藏  举报