Python 元组
元组
Python中的元组,类型是tuple。
元组与列表非常相似,可以存储任意类型的数据,但是一个元组定义好之后就不能够再进行修改。
基本声明
以下是使用类的形式进行声明:
tup = tuple((1, 2, 3, 4, 5))
print("值:%s,类型%s" % (tup, type(tup)))
# 值:(1, 2, 3, 4, 5),类型<class 'tuple'>
也可以选择使用更方便的字面量形式,使用,对元素之间进行分割:
tup = 1, 2, 3, 4, 5
print("值:%s,类型%s" % (tup, type(tup)))
# 值:(1, 2, 3, 4, 5),类型<class 'tuple'>
为了美观,我们一般会在两侧加上(),但是要确定一点,元组定义是,而并非():
tup = (1, 2, 3, 4, 5)
print("值:%s,类型%s" % (tup, type(tup)))
# 值:(1, 2, 3, 4, 5),类型<class 'tuple'>
多维元组
当一个元组中嵌套另一个元组时,该元组就可以称为多维元组。
如下,定义一个二维元组:
tup = (1,2,("三","四"))
print("值:%s,类型:%s"%(tup,type(tup)))
# 值:(1, 2, ('三', '四')),类型:<class 'tuple'>
类型转换
元组支持与bool和str以及set进行转换:
tup = (1,2,3)
b_tup = bool(tup) # 布尔类型
s_tup = str(tup) # 字符串类型
set_tup = set(tup) # 集合类型
print("值:%s,类型:%s"%(b_tup,type(b_tup)))
print("值:%s,类型:%s"%(s_tup,type(s_tup)))
print("值:%s,类型:%s"%(set_tup,type(set_tup)))
# 值:True,类型:<class 'bool'>
# 值:(1, 2, 3),类型:<class 'str'>
# 值:{1, 2, 3},类型:<class 'set'>
如果多维元组遵循一定的规律,那么也可以将其转换为dict:
tup = (("k1","v1"),("k2","v2"),("k3","v3"))
d_tup = dict(tup)
print("值:%s,类型:%s"%(d_tup,type(d_tup)))
# 值:{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'},类型:<class 'dict'>
其他特性
元组属于不可变的容器类型,因此可以将其看作原子容器类型。
元组一旦定义好,就不可被修改,因此定义元组时要充分考虑到应该存入那些数据。
元组和列表很相似,你应该在恰当的时候使用元组,而不要一味的使用列表。
索引切片
元组的索引切片与字符串相同,可参见文章:https://www.cnblogs.com/YunyaSir/articles/13832635.html
基本使用
使用索引可以对元组中的元素进行查取操作:
tup = ("A", "B", "C", "D")
# 查
result = tup[2]
print(result)
# C
任何的增删改操作都会引发异常:
tup = ("A", "B", "C", "D")
tup += "E"
print(tup)
# TypeError: can only concatenate tuple (not "str") to tuple
试图访问一个超出索引之外的元素,将抛出异常:
tup = ("A", "B", "C", "D")
print(tup[100])
# IndexError: tuple index out of range
使用[:]对当前元组进行引用,它与str相同。都是引用同一内存,并非进行拷贝:
tup = ("A", "B", "C", "D")
print("值:%s,地址编号:%d"%(tup,id(tup)))
copy_tup = tup[:]
print("值:%s,地址编号:%d"%(copy_tup,id(copy_tup)))
# 值:('A', 'B', 'C', 'D'),地址编号:10289272
# 值:('A', 'B', 'C', 'D'),地址编号:10289272
多维取值
使用多重索引来对多维元组进行取值,如下示例,在三维元组中取出元素9:
tup = (1, 2, 3, (4, 5, 6, (7, 8, 9)))
result = tup[3][3][-1]
print(result)
# 9
解构方法
*语法
使用*语法可对元组进行解构,将元组中的元素全部提取出来:
tup = (1, 2, 3)
print(*tup)
# 1 2 3
我们可以利用*语法的特性,来达到两个元组进行合并产生新元组的效果:
t1 = (1, 2, 3)
t2 = (4, 5, 6)
result = (*t1, *t2)
print(result)
# (1, 2, 3, 4, 5, 6)
解构赋值
如果一个元组中的元素需要赋值到变量中,可使用解构赋值,需要注意的是变量接收位置与元组中的元素位置一一对应:
tup = ("云崖", 19)
name, age = tup
print(name, age)
# 云崖 19
常用方法
获取长度
使用len()来进行长度的获取。
返回int类型的值。
tup = ("A", "B", "C", "D")
print(
len(tup) # 4
)
统计次数
使用count(eleName)统计元素在该元组中出现的次数。
返回int。
tup = ("A", "B", "C")
result = tup.count("A")
print(result)
# 1
查找位置
使用index(eleName)找到元素在当前元组中所在的索引值,如元素不存在则抛出异常。
返回int。
tup = ("A", "B", "C")
result = tup.index("A")
print(result)
# 0
注意事项
元组中应该存放一些不可变的数据类型,如str、int、float等原子类型的数据。
如下示例,在元组中存放了一个可变类型的数据list,如果修改这个list的话那么元组的定义就会显得十分尴尬。
tup = (1, 2, 3, ["A", "B", "C"])
print(tup)
tup[-1][-1] = "c"
print(tup)
# (1, 2, 3, ['A', 'B', 'C'])
# (1, 2, 3, ['A', 'B', 'c'])
如上示例,元组套列表,这种行为可称之为SB,此外还有元组套字典,元组套集合的行为都统称为SB。
虽然元组可以存放任意类型的数据,但是一定要避免存入非原子类型(可变类型)的数据。

浙公网安备 33010602011771号