在day10
下创建一个名为01-元组
的代码文件。
前面说的列表是可变的(动态数据) --> 容器型数据类型:列表、字符串、元组
一、元组是不可变类型的数据(静态数据)
问:有列表了,为什么还要创建个元组?程序需要考虑性能。元组要比列表更加轻量,变相的说:元组性能优于列表python在后台有一个垃圾回收机制
答:1、对静态数据(不可变)做一些资源缓存,垃圾回收机制的存在,使得一些不被使用的变量释放出它所占用的内存,返还给操作系统,以便其他变量或其他应用使用
2、对于静态数据,例如:元组。如果他不被使用,并且所占内存空间很小时,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)
timeit --> 也能测试程序的执行时间(用于计时小代码的)
timeit()方法有个默认值number,number的默认值为1000000,也就是说,调用的timeit方法变相的相当于将Timer类接受到的一小段代码执行1000000次,ctrl + 方法
import timeit
t1 = timeit.Timer('x = [1, 2, 3, 4, 5]')
print(t1.timeit())
t2 = timeit.Timer('y = (1, 2, 3, 4, 5)')
print(t2.timeit())
打印结果为:
在day10
下创建一个名为02-元组相关知识
的代码文件。
一、性质
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))
打印结果为:
三、下标、切片、循环遍历
元组、列表、字符串的下标、切片、循环遍历是一模一样的
从左向右,从0递增;从右向左,从-1开始递减。----> len方法能求出容器的长度
四、拼接、重复
print((1, 2, 3) + (1,))
print((1,) * 10)
五、成员运算:in 、not in
----> 判断元素是否在容器中存在
print(2 in (1, 2, 3))
print((2,) in (1, 2, 3))
打印结果为:
六、思考:C语言中两个变量交换值
a = 100
b = 200
想要b=a,引入中间变量
t = a
a = b
b = t
print(a, b)
在python中
a, b = b, a
print(a, b)
元组的打包操作和容器的解包操作
打包操作
----> 在python中,允许一个变量同时等于多个值,多个值会被打包成元组
x = 1, 2, 3
print(x)
解包操作
----> python中两个变量和三个变量的交换是应用了python字节码指令中的ROT_TWO和ROT_THREE指令,当需要交换值的变量大于三时,才是应用了解包和打包操作
i, j, z = x
print(i, j, z)
打印结果为:
七、更高级的解包操作
两个变量去解5个变量的元组 ----> too many values to unpack
x = (1, 2, 3, 4, 5)
i, j = x
# print(i, j)
解包失败,只能这样吗?
情况一:解包的变量和容器中元素个数相等
i, j, z, a, b = x
print(i, j, z, a, b)
情况二:解包的变量数量小于容器中元素的个数
1、将 * 放在变量前,可以使这个变量变成不定长变量
i, *j = x
print(i, j) # --> 1 [2, 3, 4, 5]
2、将定长变量
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]
print(x, y, m, n, a, b, c, d)
问:x, y, m, n, c, d分别是多少?
打印结果如下:
八、元组的相关方法
max, min, count, sum, sorted, index在元组中同样适用
1、max、min: 求最大值、求最大值(注意:容器中元素的类型要一致)
2、sum:求和(要求容器中元素都得是数值)
3、count:求某个元素出现的次数
4、sorted:默认将元素从小到大排序(注意:容器中元素的类型要一致)
5、index:从左向右查找元素,找到此元素就停止查找,没找到报错。
IT行业常说的行业黑话(约定成俗的某些东西):CRUD ----> 什么是CRUD?增删改查
九、元组的删除
元组是不可变数据类型,不能进行元素的CUD操作。但是可以对整个元素进行删除操作。
t = (1, 2)
print(t)
del t
# print(t) name 't' is not defined