元组

元组是不可变类型的列表

一、元组和列表的比较:

程序需要考虑性能,元组要比列表更加轻量,变相的说:元组的性能优于列表。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