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`
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在重命名的時候使用了下划線 _ 加元素所在索引數的方式進行重命名。
附兩段官方文檔代碼實例:
- 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``)`
- 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)`