什么是元组
元组是Python的内置数据结构之一,是一个不可变序列,可以认为元组是一种特殊的列表,其中的元素不可以被改变。
- 先简单说下可变序列 与 不可变序列的区别
- 不可变序列
例如:字符串,元组
特点:没有增、删、改的操作 - 可变序列
例如:列表,字段,集合
特点:可以对序列执行增、删、改操作,但对象内存地址不发生改变
- 什么叫不可变 及 验证不可变
所谓元组的不可变指的是元组所指向的内存中的内容不可变。从以下实例可以看出,重新赋值的元组 tup,绑定到新的对象了,不是修改了原来的对象。
tup = ('r', 'u', 'n', 'o', 'o', 'b')
tup[0] = 'g' # 不支持修改元素
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
id(tup) # 查看内存地址
4440687904
tup = (1,2,3)
id(tup)
4441088800 # 内存地址不一样了
- 为啥要有不可变序列?
当一个数据在被多方操作时,可能会导致数据不准确。例如多个人在操作同一张银行账户取钱,如果大家都在同意时刻取钱,那么在取的那刻钱是一样多的,多人取出的钱可能超出账户余额,造成数据异常。可变序列面对这种问题的时候,需要有加锁机制,每次数据在某一时刻只能被一个人操作(即加锁),当这个人操作完成解锁后,其他人再操作。而不可变序列,直接是不让改变,对元素有只读操作。省去类似锁机制的过程。
元组的创建
元组使用小括号 ( ),列表使用方括号 [ ]。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。需要注意的是,创建空元素元组和创建单个元素元组的特殊情况。
- 创建元组
#1.使用()
my_tuple0 = (1,2,"3")
print(my_tuple0) #(1,2,"3")
#2.使用内置函数tuple()
my_tuple1 = tuple((1,2,"3"))
print(my_tuple1) #(1,2,"3")
#3.小括号可以省略
my_tuple2 = 1,2,"3"
print(my_tuple2) #(1,2,"3")
针对上述的小括号省略来创建单个元素的元组时,会出现歧义。
例如,创建一个只有一个整数1的元组,如果省略小括号则是 my_tuple3 = 1。此时my_tuple3 是一个整型变量
- 创建单个元素元组
#1.小括号不可以省略,且需要在元素后添加,
my_tuple2 = (1,)
print(my_tuple2) #(1,)
#如果没有逗号, 会认为是在为一个整型复制,()是运算符,提高优先级
#2.使用内置函数tuple()
my_tuple1 = tuple((1,))
print(my_tuple1) #(1,)
元组推导式
- 语法
结果元组对象名 = ( 表达式1 for i in 原元组对象 if 表达式2)
- 举例
访问生成器对象从下面的结果中可以看出,使用元组推导式生成的结果不是一个元组或者列表,而是一个生成器对象,这一点和列表生成器是不同的。可以通过for去遍历 或者使用tuple()将其转为一个元组。
src_tuple = (1,2,3,4)
#1.利用元组推导式,将src_tuple内的元素乘以2后生成新元组res_tuple
res_tuple = (i * 2 for i in src_tuple)
print(res_tuple) #<generator object <genexpr> at 0x00000000028668E0>
#利用for遍历
for i in res_tuple:
print(i,end='\t') #2 4 6 8
#使用tuple()转为元组
print(tuple(res_tuple)) #(2,4,6,8)
#2.利用元组推导式,将src_tuple内大于2的元素乘以2后生成新元组res_tuple1
res_tuple1 = (i * 2 for i in src_tuple if i > 2)
print(tuple(res_tuple2)) #(6,8)
访问元组
元组索引
和列表一样,元组可通过索引访问到内部元素。下标索引从 0 开始,可以进行截取,组合等
单个元素
利用索引取出对应索引位置的元素
tup1 = ('Google', '优快云', 1997, 2000)
print("tup1[0]: ", tup1[0]) #Google
多个元素
和列表的切片相同,生成一个新的元组
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print ("tup2[1:5]: ", tup2[1:5]) # (2, 3, 4, 5)
tup = ('Google', '优快云', 'Taobao', 'Wiki', 'Weibo','Weixin')
python表达式 | 结果 | 描述 |
---|---|---|
tup[1] | ‘优快云’ | 读取元组第二个元素 |
tup[-2] | ‘Weibo’ | 反向读取,读取倒数第二个元素 |
tup[1:] | (‘优快云’, ‘Taobao’, ‘Wiki’, ‘Weibo’, ‘Weixin’) | 截取元素,从第二个开始后的所有元素 |
tup[1:4] | (‘优快云’, ‘Taobao’, ‘Wiki’) | 截取元素,从第二个开始到第四个元素(索引为 3) |
遍历元组
tup3 = (1, 2, 3, 4, 5, 6, 7)
for i in tup3:
print(i)
for i in range(len(tup3)):
print(tup3[i])
修改元组
上面说的元组是不可变的序列,这里说的修改指的是扩展元组,在改变后又创建了新的元组。
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
# 以下修改元组元素操作是非法的。
# tup1[0] = 100
# 创建一个新的元组
tup3 = tup1 + tup2
print (tup3)
删除元组
元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,例如:
tup = ('Google', '优快云', 1997, 2000)
print (tup)
del tup
print ("删除后的元组 tup : ")
print (tup)
#删除后的元组 tup :
#Traceback (most recent call last):
# File "test.py", line 8, in <module>
# print (tup)
#NameError: name 'tup' is not defined
元组运算符
与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。
python表达式 | 结果 | 描述 |
---|---|---|
(1, 2, 3) + (4, 5, 6) | (1,2,3,4,5,6) | 元组连接 |
(‘Hi!’,) * 4 | (‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’) | 元组复制 |
3 in (1, 2, 3) | True | 元素是否存在于元组 |
元组内置函数
有元组 a = (0,1,2,3)
有列表 b = [4,5,6,7]
方法及描述 | 实例 |
---|---|
len(a): 计算元组元素个数 | print(len(a)) #4 |
max(a): 返回元组中元素最大值 | print(max(a)) #3 |
min(a): 返回元组中元素最小值 | print(min(a)) #0 |
tuple(iterable): 将可迭代系列转换为元组 | print(tuple(b)) #(4,5,6,7) |