实际案例
学生信息系统中数据为固定格式:(名字,年龄,性别,邮箱地址,...)
如:学生数量很大为了减小存储开销,对每个学生信息用元组表示:
('Jim', 16, 'male', 'jim@gmail.com')
('Li', 17, 'male', 'li@163.com')
('Lucy', 16, 'female', 'lucy@qq.com')
...
用 Tuple 的好处
Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换。
通常我们采用索引的方式访问元组,具体操作如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# -*- coding: utf-8 -*-
__author__
=
'songhao'
st
=
(
'Jim'
,
16
,
'male'
,
'jim@gmail.com'
)
name
=
st
[
0
]
age
=
st
[
1
]
sex
=
st
[
2
]
email
=
st
[
3
]
print
(
name
,
age
,
sex
,
email
)
#Jim 16 male jim@gmail.com
# 根据上面的结果依然可以获取st的个人信息,但是对于元组的可读性很低,这是我们通常不愿意使用索引获取元组的原因
|
我们上面是通过索引的方式进行获取个人信息,通过0,1,2,3,4,因为元组的字段是固定的,所以我们可以用赋值的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
|
In
[
1
]
:
NAME
,
AGE
,
SEX
,
EMAIL
=
range
(
4
)
In
[
2
]
:
NAME
,
AGE
,
SEX
,
EMAIL
Out
[
2
]
:
(
0
,
1
,
2
,
3
)
name
=
st
[
NAME
]
age
=
st
[
AGE
]
sex
=
st
[
SEX
]
email
=
st
[
EMAIL
]
print
(
name
,
age
,
sex
,
email
)
# 利用枚举的方式是不是很方便,也增加了可读性呢
|
还有一种方法,我们可以采用命名元组的方式,
什么是命名元组呢?
namedtuple对象的定义如以下格式:
[code]
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个命名元祖子类typename,其中参数的意义如下:
typename,:此元组的名称;
field_names: 元祖中元素的名称(类似于c结构体中的age等),此字段有多种表达方式,见例子;
rename:如果元素名称中含有python的关键字,则必须设置为rename=True,具体见下面;
verbose:默认就好;
[code]
In [6]: namedtuple?
Signature: namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)
Docstring:
Returns a new subclass of tuple with named fields.
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Point.__doc__ # docstring for the new class
'Point(x, y)'
>>> p = Point(11, y=22) # instantiate with positional args or keywords
>>> p[0] + p[1] # indexable like a plain tuple
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessible by name
33
>>> d = p._asdict() # convert to a dictionary
>>> d['x']
11
>>> Point(**d) # convert from a dictionary
Point(x=11, y=22)
>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields
Point(x=100, y=22)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# -*- 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
)
In
[
7
]
:
st
=
Student
(
'songhao'
,
27
,
'男'
,
'admin@168seo.cn'
)
In
[
8
]
:
st
.
name
Out
[
8
]
:
'songhao'
In
[
9
]
:
st
.
age
Out
[
9
]
:
27
In
[
10
]
:
st
.
sex
Out
[
10
]
:
'男'
In
[
11
]
:
st
.
email
Out
[
11
]
:
'admin@168seo.cn'
|