Python 50问 [2]:如何为元组中每个元素命名

常规场景

先来看一个案例。

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

# 现有如下的一些元组
# ('Jim', 16, 'male', 'jim@ursb.me')
# ('Airing', 20, 'male', 'airing@ursb.me')
# ('Lucy', 16, 'female', 'lucy@ursb.me')

student = ('Jim', 16, 'male', 'jim@ursb.me')

# 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', 'airing@ursb.me')

# name 
print student[NAME]

# age
print student[AGE]

# sexprint student[SEX]

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

from collections import namedtuple

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

# 相当于实例化类对象
s = Student('Airing', 20, 'male', 'airing@ursb.me')

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,460评论 25 708
  • 七点过,洗完澡,拖着鞋缩在我大大的椅子上戳着刚剥好的柚子,顶着湿漉漉的头发在温暖的空调房里等着爸妈的电话! 我认为...
    男神李二狗阅读 247评论 0 0
  • 本来我打算这个月报考中级会计的考试的,但是因为各种自己的原因,应该报不上了,反正我报名的目的是为了学习一些理财知识...
    胖连OnTheWay阅读 403评论 0 0
  • 之前Sir推荐过一部短片。 讲单身的真正原因: 有朋友就说,没对象闹心; 有对象,更闹心。 该分手的理由,比找不到...
    Sir电影阅读 1,445评论 1 18