python 元组

元组(Tuple)

元组既可以像列表同时容纳多种类型的对象,也拥有字符串不可变的特性,但是列表是可变的。

所以元组是阉割了的列表么?

1 元组和列表类似之处

# 从语法上来看,列表是[],元组是()
列表:[元素1,元素2,...]
元组:(元素1,元素2,...)
# 事实上,在定义元组时不加()也是可以的,只要使用,隔开就行
元组可以使用下标来读取其中的元素,但是元组是不可变的,所以说试图修改元组内容的行为是不可取的
元组也支持切片操作,因为切片操作的本质是将目标对象中的元素,以某种特定的组合导出,而非修改对象本身,也就是切片后返回的是一个新的对象,并非在原本的对象上进行修改

由于元组的不可变性,不支持修改,所以列表中的增删改查,在元组中只有“查”

元组中只有count()和index()方法

tup = 1,2,3,4,1,"hello"
tup  # (1, 2, 3, 4, 1, 'hello')
tup.count(1)  # 2
tup.index(3)  # 2
# 元组之间可以加、乘、拼接、支持迭代、嵌套
a = 1, 2, 3
b = 4, 5, 6
c = a + b  # (1, 2, 3, 4, 5, 6)
d = a * 2  # (1, 2, 3, 1, 2, 3)
e = a, b  # ((1, 2, 3), (4, 5, 6))
for each in e:
    for i in each:
        print(i,end=" ")
    print()
"""
1 2 3 
4 5 6 
"""
# 列表推导式同样适用于元组,因为元组是可迭代的,推导之后数据类型发生改变元组变为列表
s = 1, 3, 6  # <class 'tuple'>
q = [i*2 for i in s]  # [2, 6, 12]<class 'list'>

注意上面使用的是[],所以最后的结果是列表,不要改成(),没有元组推导式这种玩意。

在不产生歧义的情况下,元组是可以省略()的,但是在什么情况下必须要加上()?什么时候可以省略?与其纠结()加不加给代码带来的问题,我的建议是你都给加上为好!

# 如何生成只有一个元素的元组
# 关键之处是逗号,
x = (520)  # <class 'int'>
y = (520,)  # <class 'tuple'>

2 打包和解包

生成一个元组——元组的打包

将元组中的元素一次性赋值给多个变量名——元组的解包

c = (1, 2, 3, 4, 5, 6)
t = 1, c, "hello"
x, y, z = t
x  # 1
y  # (1, 2, 3, 4, 5, 6)
z  # 'hello'

这种解包的方式,不仅适用于元组,也适用于任何的序列类型(列表、元组、字符串),注意:但是无论是哪种类型的序列解包,赋值号左边的变量名数量必须与右侧序列的元素数量一致。

# 使用*可以使得左侧的数量和右侧的数量不一样
name = "hello lin"
a, b, *c = name
a, b, c
('h', 'e', ['l', 'l', 'o', ' ', 'l', 'i', 'n'])

3 Python的多重赋值

实现逻辑:

①通过元组进行打包

②再将元组进行解包,赋给左侧的对应变量

x, y = 10, 20
_ = (10, 20)
x, y = _

4 元组真的固若金汤?

当元组中的元素指向一个可变对象时,那么此时可以修改该可变对象中的内容

x = [1, 2, 3]
y = [4, 5, 6]
w = (x, y)  # ([1, 2, 3], [4, 5, 6])
w[0][0] = 6
w  # ([6, 2, 3], [4, 5, 6])

posted @ 2023-02-23 17:42  努力生活的小林  阅读(72)  评论(0)    收藏  举报