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

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

命名元组的工厂函数

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`

img

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

img

  但是在使用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``)`
  1. 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)`
posted @ 2019-05-22 16:12  道理我都懂Zz  阅读(1230)  评论(0编辑  收藏  举报