介绍
元组是python的一个基本数据类型。元组和列表相似,可以存放任意数据类型。
只不过元组一旦被定义,其内部元素不支持修改和删除操作。故元组又被称为只读列表。
注意:元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变。
定义元组
# 方式一:括号+逗号(推荐)
size = (480, 230)
# 方式二:逗号
size = 480, 230
# 方式三:tuple(可迭代类型变量)
>>> size = tuple((230, 480)) # size = (480, 230)
>>> size = tuple([480, 230]) # size = (480, 230)
>>> size = tuple('123') # size = ('1', '2', '3')
补充:元组的特征在于 ,
而不是 ()
>>> a = 230,
>>> type(a)
<class 'tuple'>
# 如果单纯的 a = (230),此处的括号只是数学上的运算符而已,所包围的元素构不成一个元组。
索引访问元组
通过索引值访问元组中的元素,但是不允许通过索引值修改元组,否则报错。
>>> user = ('jack', 'cindy', 'frank')
>>> user[1]
'cindy'
>>> user[1]='egon'
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
user[1]='egon'
TypeError: 'tuple' object does not support item assignment
补充:当元组的元素是一个可变数据类型时,允许修改该元素的元素
>>> a = (1,2,3,[11,22,33],4)
>>> a[3][2]=44
>>> a
(1, 2, 3, [11, 22, 44], 4)
# 这是因为元组存放的是[11,22,44]这个列表的内存地址,这个列表内存地址是不变的存在元组中不允许被修改;但是该列表是可变,这个列表包含的元素的内存地址是存在另外一块空间里的,是可变的。
in not in 判断元素是否在元组中,返回布尔值
查看元组长度len()
>>> size = (480, 230)
>>> len(size)
2
删除元组 del
元组一旦定义,内部元素不允许被删除。但是可以通过 del 删除整个元组
>>> size = (480,320)
>>> del size
>>> size
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
size
NameError: name 'size' is not defined
切片
切片:从一个大的元组中copy出来一个子元组,原元组不变。同列表、字符串的切片用法一样。
# 切片总结:a[start:end:step]
# start :起始位置下标
# end :终止位置下标
# step :步长,正数表示从左往右;负数表示从右往左
# 总体原则:顾头不顾尾
内置方法
count(value) 返回数字
# count用于统计元组中value存在的个数;和列表的count()方法相同。
>>> size = (480, 320)
>>> size.count(320)
1
>>> size.count(1)
0
index(value, start, end) 返回索引
# index返回value在元组的最小索引值,可选参数start和end限定查找的范围。
# 当value不在查找的范围内,则报错。
# 该方法与列表、字符串的index方法完全一致。
补充
具名元组
具名元组(namedtuple)是元组(tuple)的一个兄弟。它和tuple类似,一旦被定义不能被修改。
但是namedtuple比tuple功能更丰富,支持类似字典的"键值对"形式的数据访问。
并且,namedtuple兼容tuple的语法使用。
定义:使用namedtuple 需要从collections模块中引入 namedtuple
>>> from collections import namedtuple
>>> Point = namedtuple('Point', 'x, y') # 定义nametuple类Point,两个参数名:x,y
>>> p = Point(11, 22) # 实例化p, 名字x代表11, 名字y代表22
>>> p
Point(x=11, y=22)
>>> p[1] # 与tuple兼容,可通过索引访问元素
22
>>> p[1]=33 # 也不支持修改元素值
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
p[1]=33
TypeError: 'Point' object does not support item assignment
>>> p.x # 支持通过名字访问元素,更简洁
11
>>> type(p.x)
<class 'int'>
>>> p._asdict() # 将namedtuple转化为有序字典
OrderedDict([('x', 11), ('y', 22)])
>>> d = p._asdict()
>>> Point._make(**d) # 可以通难过字典创建namedtuple
Point(x=11, y=22)
>>> p._replace(x=120) # _replace与字符串replace()方法一样,返回一个替换新元素的namedtuple
Point(x=120, y=22)
# 总结:
# 1:先定义namedtuple类再使用这个类实例化一个namedtuple对象;
# 2:namedtuple对象有 定义时的属性名,直接通过(.属性名)的方式访问数据。
# 3:namedtuple对象还有 _asdict(),_replace()方法使用
# 4:namedtuple类有 _make()方法使用