如何在元组中的每个元素命名,提高程序可读性

实际案例

学生信息系统中数据为固定格式:(名字,年龄,性别,邮箱地址,...)

如:学生数量很大为了减小存储开销,对每个学生信息用元组表示:
('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

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 问题 大量使用索引,无法确切辨识内容 C语言解决方法1, 使用宏定义2, 使用枚举类型 解决办法 1, 定义常量 ...
    lupinwu阅读 278评论 0 0
  • 昨天看了树丰的一篇文章,讲自己参加一个培训以及在培训中得到了一个非常有用的表格。那个表格设计还不错,但是仔细一看,...
    赛北熊在重庆阅读 220评论 0 0
  • 看完《我梦中的风月江南》,分享最美的文字,最能打动心尖美景的画面给大家。 从前慢,一切故事都被隐在了江南烟雨中; ...
    LLLL小姐阅读 251评论 1 1
  • 实在对不住自己啊,刚看到网上有喜欢和讨厌台湾的事情,才想起来,自己也是一样,那就趁着记忆,卸下来、 公交车两段式收...
    法雲阅读 1,057评论 0 0