1.原因:
当存储一个学生信息的时候使用字典是十分方便的,例如下面这样:
student = {
'name' : "小明",
'sex' : 'Man',
'tel' : '123456',
'score' : 100,
'address' : 'xxxx'
}
因为这样可以很直观的显示出一个学生的各个信息,但是当有很多学生的时候使用元组是不是可以更简单呢?我们只需要将所有的元组元素使用相同的排列方式,例如:
s1 = ('小明', 'Man', '123456', 100, 'xxxx')
第一个元素表示名字,第二个元素表示性别,第三个元素表示电话号码,第四个元素表示分数,第五个元素表示地址.最重要的是在存储的时候元组占用的存储空间比字典少.所以当有大量数据的时候使用元组会节省大量的空间.
但是这样的话就会出现一个问题:在访问元组属性上的时候我们使用类似于s1[0],s1[2]……这些我们自己知道表示的是姓名和电话号码,但是其他阅读你代码的人知道吗?所以我们可以给元组的元素命名,这样的话就能十分直观的让阅读代码的人知道我们调用的是哪一个“属性”.
2.方法一:使用collections.namedtuple代替内置的tuple
话不多说,我们直接上代码:
'''
!
'''
# 导入namedtuple
from collections import namedtuple
# 创建一个学生“类”,名字叫student
student = namedtuple('stduent', ['name', 'sex', 'tel', 'score', 'address'])
# 创建一个namedtuple对象
s = student('小明', 'Man', '123456', 100, 'xxxx')
# 查看创建的对象
print(s)
# 判断对象的类型是不是tuple
print(isinstance(s, tuple))
# 尝试使用字典的方式调用对象属性
print(s.name)
print(s.sex)
print(s.tel)
print(s.score)
print(s.address)
注释:
新的访问namedtupyle元素的方式不再是以前的s[0],s[1]……而是在对象后面更属性名(这也是为什么我喜欢称他们为类,对象,和属性)
输出结果:
stduent(name='小明', sex='Man', tel='123456', score=100, address='xxxx')
True
小明
Man
123456
100
xxxx
3.方法二:使用枚举类型:
原本的元组可读性差的原因在于不知道元素顺序表示的含义的时候很难通过数字判断,所以我们可以使用枚举类型来代替原本属性调用时候的数字.
具体请看代码:
#导入整数枚举
from enum import IntEnum
#创建整数枚举类型
class st(IntEnum):
name = 0
sex = 1
tel = 2
score = 3
address = 4
s = ('小明', 'Man', '123456', 100, 'xxxx')
#元素调用
print(s[st.name], s[st.sex], s[st.address], s[st.tel], s[st.score], s[st.address])
小明 Man xxxx 123456 100 xxxx