元组
元组是不可变类型的列表
一、元组和列表的比较:
程序需要考虑性能,元组要比列表更加轻量,变相的说:元组的性能优于列表。Python在后台有一个垃圾回收机制,对静态数据(不可变)做一些资源缓存;垃圾回收机制的存在,使得一些不被使用的变量释放出它所占用的内存,返还给操作系统,以便其他的变量或应用使用。对于静态数据,例如元组,如果它不被使用并且所占用的内存空间很小时,Python不会将其回收,会暂时缓存这部分内存,这样,下次在创建同样大小的元组时,就不需要再向系统申请,可以直接拿来使用,这样便大大加快了程序的速度。
# 元组列表性能测试:
import time
start1 = time.time()
x = [1, 2, 3, 4, 5]
end1 = time.time()
print(start1 - end1)
start2 = time.time()
y = (1, 2, 3, 4, 5)
end2 = time.time()
print(start2 - end2)
运行结果:0.0
0.0
# timeit --> 也能够测试程序的执行时间
# timeit()方法有个默认值number,number的默认值为1000000,也就是说,
# 调用timeit方法变相的相当于将Timer类接收到的一小段代码执行1000000次,得到最终的时间累计和。
import timeit
t1 = timeit.Time('x = [1, 2, 3, 4, 5]')
t2 = timeit.Time('y = (1, 2, 3, 4, 5)')
print(t1.timeit())
print(t2.timeit())
运行结果:0.048402999999999995
0.011691300000000002
二、元组的性质
1.元组是不可变的容器型数据类型(没有增删改)
2.元组是有序的容器型数据类型(有下标)
3.元组中的元素可以是任意类型的元素
4.元组的类型:tuple;容器符号:();元组之间用逗号隔开
三、创建元组
创建列表:[], [1], [1, 2]
创建字符串:'', 'a'
# a.创建一个空元组
t1 = ()
print(t1, type(t1))
# b.创建一个元素的元组
t2 = (1,)
print(t2, type(t2))
t3 = (1)
print(t3, type(t3))
运行结果:() <class 'tuple'>
(1,) <class 'tuple'>
1 <class 'int'>
三、下标、切片、循环遍历
元组、列表、字符串的下标、切片、循环遍历是一模一样的。
四、拼接、重复
print((1, 2, 3) + (1,))
print((1,)*3)
运行结果:(1, 2, 3, 1)
(1, 1, 1)
五、成员运算:in、not in
判断元素是否在容器中存在
print(2 in (1, 2, 3))
print((2,) in (1, 2, 3))
运行结果:True
False
六、元组的打包操作和解包操作
在Python中,允许一个变量同时等于多个值,这多个值会被打包成元组
x = 1, 2, 3
print(x)
运行结果:(1, 2, 3)
i, j, k = x
print(i, j, k)
运行结果:1 2 3
Python中两个变量和三个变量值的交换是应用了Python字节码指令中的
ROT_TWO和ROT_THREE指令,当需要交换值的变量大于三时,才是应用了解包和打包操作。
更高级的解包操作:
x = (1, 2, 3, 4, 5)
情况一:解包的变量和容器中元素个数相同
i, j, z, a, b = x
print(i, j, z, a, b)
运行结果:1 2 3 4 5
情况二:解包的变量数量小于容器中元素的个数(*,放在变量前,可以使这个变量变成不定长变量)
i, *j, z = x
print(i, j, z)
运行结果:1 [2, 3, 4] 5
情况三:解包的变量数量大于容器中元素个数(几乎遇不到)(注意:如果解包操作涉及到不定长变量,不定长变量只能有一个。)
x, y, *m, n = [11, 22, 33, 44, 55]
a, b, *c, d = [1, 2, 3]
# 问:x, y, m, n, a, b, c, d分别是多少?
print(x, y, m, n, a, b, c, d)
运行结果:11 22 [33, 44] 55 1 2 [] 3
七、元组的相关方法
max、min、count、sum、sorted、index等在元组中同样适用。
max、min:求最大值,求最小值(注意:容器中元素的类型要一致)
sum:求和(要求容器中元素都得是数值)
count:求某个元素出现的次数。
sorted:默认将元素从小到大排序(注意:容器中元素的类型要一致)
index:从左向右查找元素,找到此元素就停止查找,没找到报错。
八、元组的删除
元组是不可变的数据类型,不能进行增删改操作。但是可以对整个元组进行删除操作
t = (1, 2)
print(t)
del t
print(t)
运行结果:(1, 2)
name 't' is not defined