1 数据结构-元组 tuple
1.1 在Python中,元组也是多个元素按照一定的顺序构成的序列。元组和列表的不同之处在于,元组是不可变类型,这就意味着元组类型的变量一旦定义,其中的元素不能再添加或删除,而且元素的值也不能进行修改。
# 定义一个三元组 t1 = (30, 10, 55) # 定义一个四元组 t2 = ('骆昊', 40, True, '四川成都') # 查看变量的类型 print(type(t1), type(t2)) # <class 'tuple'> <class 'tuple'> # 查看元组中元素的数量 print(len(t1), len(t2)) # 3 4 # 通过索引运算获取元组中的元素 print(t1[0], t1[-3]) # 30 30 print(t2[3], t2[-1]) # 四川成都 四川成都
# 循环遍历元组中的元素
for member in t2:
print(member)
# 成员运算
print(100 in t1) # False
print(40 in t2) # True
# 拼接
t3 = t1 + t2
print(t3) # (30, 10, 55, '骆昊', 40, True, '四川成都')
# 切片
print(t3[::3]) # (30, '骆昊', '四川成都')
# 比较运算
print(t1 == t3) # False
print(t1 >= t3) # False
print(t1 < (30, 11, 55)) # True
1.2 打包和解包的操作
当我们把多个用逗号分隔的值赋给一个变量时,多个值会打包成一个元组类型;当我们把一个元组赋值给多个变量时,元组会解包成多个值然后分别赋给对应的变量,如下面的代码所示。
# 打包 a = 1, 10, 100 print(type(a), a) # <class 'tuple'> (1, 10, 100) # 解包 i, j, k = a print(i, j, k) # 1 10 100
在解包时,如果解包出来的元素个数和变量个数不对应,会引发ValueError
异常,错误信息为:too many values to unpack
(解包的值太多)或not enough values to unpack
(解包的值不足)。
a = 1, 10, 100, 1000 # i, j, k = a # ValueError: too many values to unpack (expected 3) # i, j, k, l, m, n = a # ValueError: not enough values to unpack (expected 6, got 4)
有一种解决变量个数少于元素的个数方法,就是使用星号表达式,我们之前讲函数的可变参数时使用过星号表达式。有了星号表达式,我们就可以让一个变量接收多个值,代码如下所示。需要注意的是,用星号表达式修饰的变量会变成一个列表,列表中有0个或多个元素。还有在解包语法中,星号表达式只能出现一次。
a = 1, 10, 100, 1000 i, j, *k = a print(i, j, k) # 1 10 [100, 1000] i, *j, k = a print(i, j, k) # 1 [10, 100] 1000 *i, j, k = a print(i, j, k) # [1, 10] 100 1000 *i, j = a print(i, j) # [1, 10, 100] 1000 i, *j = a print(i, j) # 1 [10, 100, 1000] i, j, k, *l = a print(i, j, k, l) # 1 10 100 [1000] i, j, k, l, *m = a print(i, j, k, l, m) # 1 10 100 1000 []
1.3 元组与列表的区别
-
元组是不可变类型,不可变类型更适合多线程环境,因为它降低了并发访问变量的同步化开销。关于这一点,我们会在后面讲解多线程的时候为大家详细论述。
-
元组是不可变类型,通常不可变类型在创建时间和占用空间上面都优于对应的可变类型。我们可以使用
sys
模块的getsizeof
函数来检查保存相同元素的元组和列表各自占用了多少内存空间。我们也可以使用timeit
模块的timeit
函数来看看创建保存相同元素的元组和列表各自花费的时间,代码如下所示。 -
import sys import timeit a = list(range(100000)) b = tuple(range(100000)) print(sys.getsizeof(a), sys.getsizeof(b)) # 900120 800056 print(timeit.timeit('[1, 2, 3, 4, 5, 6, 7, 8, 9]')) print(timeit.timeit('(1, 2, 3, 4, 5, 6, 7, 8, 9)'))
1.4 Python中的元组和列表是可以相互转换的,我们可以通过下面的代码来做到。
# 将元组转换成列表 info = ('骆昊', 175, True, '四川成都') print(list(info)) # ['骆昊', 175, True, '四川成都'] # 将列表转换成元组 fruits = ['apple', 'banana', 'orange'] print(tuple(fruits)) # ('apple', 'banana', 'orange')