实际案例
学生信息系统中数据为固定格式:(名字,年龄,性别,邮箱地址,...)
如:学生数量很大为了减小存储开销,对每个学生信息用元组表示:
('Jim', 16, 'male', 'jim@gmail.com')
('Li', 17, 'male', 'li@163.com')
('Lucy', 16, 'female', 'lucy@qq.com')
...
通常我们采用索引的方式访问元组,具体操作如下:
# -*- coding: utf-8 -*-
student = ('Jim', 16, 'male', 'jim@gmail.com')
# 打印学生姓名
print student[0]
# 学生年龄
if student[1] >= 18:
pass
# 学生性别
if student[2] == 'male':
pass
这种方式虽然简单且能获取我们想要的数据,但你有没有注意到在代码中我们使用3个索引,若我们不看注释,就要看元组每一个元素所代表的信息了,这样我们代码的可读性就很低了。那有什么办法来解决这个问题呢?这时我们不妨回想一下我们大多数人在大学中学习的第一门编程语言—— C语言,我们通常在C语言中进行如下操作:
# 第一种方式——宏定义
#define NAME 0
#define AGE 1
#define SEX 2
#define EMAIL 3
# 第二种方式——枚举类型
enum Student {
NAME,
AGE,
SEX,
EMAIL,
}
因此,我们可以使用类似C语言中的枚举类型的方式访问元组,具体操作如下:
# -*- coding: utf-8 -*-
NAME = 0
AGE = 1
SEX = 2
EMAIL = 3
student = ('Jim', 16, 'male', 'jim@gmail.com')
# 打印学生姓名
print student[NAME]
# 学生年龄
if student[AGE] >= 18:
pass
# 学生性别
if student[SEX] == 'male':
pass
这样一看,我们就知道各处索引是获取元组内什么信息了,代码的可读性是不是变高了呢?让我们继续再看看我们刚刚的代码,有没有发现给NAME、AGE、SXE和EMAIL这几个变量赋值有点繁琐了呢?因此,我们可将其赋值代码进行如下转换:
NAME, AGE, SEX, EMAIL = xrange(4)
那我们再思考一下,还有没有方法既然提高程序的可读性又能获取我们的元组呢?当然是有的,我们可以使用Python标准库中collections.namedtuple替代内置的tuple,其中namedtuple函数的具体用法可查看Python官方文档,这里我们将利用namedtuple函数进行如下操作:
# -*- coding: utf-8 -*-
from collections import namedtuple
Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
s = Student('Jim', 16, 'male', 'jim@gmail.com')
print s.name, s.age, s.sex, s.email
其输出结果如下:
Jim 16 male jim@gmail.com