对于格式固定的数据,可以使用元组存储,这比使用字典要节省空间。但是访问元组数据时,需要使用索引,大量索引会降低程序可读性。

对于一个学生信息系统,数据为固定格式:(名字, 年龄, 性别, 邮箱)。

解决方案:

  1. 定义一系列的数值常量或枚举类型;

  2. 使用标准库中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