Skip to content

Latest commit

 

History

History
106 lines (66 loc) · 1.99 KB

python-2.md

File metadata and controls

106 lines (66 loc) · 1.99 KB

为元组中的每个元素命名

常规场景

先来看一个案例。

学生信息系统中数据为固定格式(姓名,年龄,性别,邮箱地址),学生数据很大为了减小存储开销,对每个学生我们用元组表示。但是,访问时,我们通常使用索引(index)访问,大量的索引降低了程序的可读性

# 现有如下的一些元组
# ('Jim', 16, 'male', '[email protected]')
# ('Airing', 20, 'male', '[email protected]')
# ('Lucy', 16, 'female', '[email protected]')

student = ('Jim', 16, 'male', '[email protected]')

# name
print student[0]

# age
print student[1]

# sex
print student[2]

可见,程序中将会大量的出现一些纯数字的索引值,非常不利于程序的维护,可读性很差,一眼看不出其含义。

C 语言中的解决方案

C 语言中,可以使用宏定义的方式解决这个问题:

#define NAME 0
#define AGE  1

也可以使用枚举类型解决:

enum Student{
    NAME,
    AGE,
    SEX,
}

Python 中优雅的解决方案

方案1:定义类似C语言中的枚举类型

这种方法,也就是定义一系列的数值常量

NAME  = 0
AGE   = 1
SEX   = 2
EMAIL = 3

# 或者 NAME, AGE, SEX, EMAIL = xrange(4)

student = ('Airing', 20, 'male', '[email protected]')

# name 
print student[NAME]

# age
print student[AGE]

# sex
print student[SEX]

方案2:使用标准库中collections.namedtuple替代内置tuple

from collections import namedtuple

# 相当于类的工厂
Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])

# 相当于实例化类对象
s = Student('Airing', 20, 'male', '[email protected]')

# 也可以使用关键字传参,但是位置需要对应
s2 = Student(name='Jim', age=16, sex='male', email='[email protected]')

# 访问元素相当于访问对象的属性
s.name
s.age
s.sex

# s也是内置类型 tuple 的子类
isinstance(s, tuple)     # => True

是不是优雅方便了许多呢?