对于格式固定的数据,可以使用元组存储,这比使用字典要节省空间。但是访问元组数据时,需要使用索引,大量索引会降低程序可读性。
对于一个学生信息系统,数据为固定格式:(名字, 年龄, 性别, 邮箱)。
解决方案:
定义一系列的数值常量或枚举类型;
使用标准库中
collections.namedtuple
替代内置tuple。
- 对于
collections.namedtuple
方法:
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个具名元组子类 typename,其中参数的意义如下:
typename:元组名称 field_names: 元组中元素的名称 rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
collections.namedtuple
是一个工厂方法,它可以动态的创建一个继承tuple的子类。跟tuple相比,返回的子类可以使用名称来访问元素。
- 方案1示例:
使用常量:
NAME,AGE,SEX,EMAIL = range(4)def message(student): if student[AGE] < 18: pass if student[SEX] == 'male' pass #... student = ('Jim', 16, 'male', 'jim123456@gmail.com')message(student)
使用枚举:
from enum import IntEnumclass StudentEnum(IntEnum): NAME,AGE,SEX,EMAIL = range(4)s = ('Jim', 16, 'male', 'jim123456@gmail.com')print(s[StudentEnum.NAME])print(s[StudentEnum.AGE])print(s[StudentEnum.SEX])print(s[StudentEnum.EMAIL])Jim #结果16male jim123456@gmail.com
- 方案2示例:
from collections import namedtuple s1 = namedtuple('Student', ['name', 'age', 'sex', 'email'])s2 = s1('Jim', 16, 'male', 'jim123456@gmail.com')print(s2)print(type(s2))print(isinstance(s2, tuple))print(s2.name)print(s2.age)print(s2.sex)print(s2.email)Student(name='Jim', age=16, sex='male', email='jim123456@gmail.com') #结果<class '__main__.Student'>TrueJim16male jim123456@gmail.com