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在重命名的時候使用了下划線 _ 加元素所在索引數的方式進行重命名。

附兩段官方文檔代碼實例:

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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM