说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
元组(tuple)跟列表(list)非常相似,二者之间的差异就是元组(tuple)不可改变(包括值和位置顺序),列表(list)是可以改变的。元组使用小括号(...)
,列表使用方括号。
元组的结构和列表一样,元组用圆括号把所有项括起来,元素之间用逗号分隔:
a = () # 空元组
a = (1, ) # 只有一个元素
a = (1, 2, 3) # 定义一个元组
tuple() # 生成空元组
tuple('hello') # ('h', 'e', 'l', 'l', 'o')
type(a) # tuple 元素检测
# 没有括号也可以定义一个元组
a = 1,23,4,56 # a: (1, 23, 4, 56)
a = 1, # a: (1, )
# 元组内元素可以混杂其他类型
a = ('a', 1.5, True, [2, 3, 4]) # 各种类型混杂
使用内置构造器函数 tuple(),是一个非常直观的创建元组方法。
元组的索引机制跟列表完全一样,可参考列表。
元组是不可修改的,我们修改元素时,就会报错。但是,我们可以修改混杂类型里的列表类型数据。
a = ('a', 1.5, True, [2, 3, 4])]
a[-1].append(5)
# ('a', 1.5, True, [2, 3, 4, 5])
del a # 删除整个元组
要注意的是:元组只是它自己元素的引用不能变,元素引用的对象变化了,是可以接受的。
a = [1, 2]
# 其中一个元素引用了列表 a
b = (0, a, 3)
b
# (0, [1, 2], 3)
id(b)
# 4495722432
# 列表 a 的引用
id(b[1])
# 4495725056
# 修改列表 a 的第一值
b[1][0] = 11
# 修改成功!
b
# (0, [11, 2], 3)
id(b)
# 4495723072
# 列表 a 的引用不变
id(b[1])
# 4495725056
元组里的引用不能直接被赋值,如:
# 直接赋值会报错
b[1] = [9, 9]
# TypeError: 'tuple' object does not support item assignment
# 这可修改
b[1][:] = [9, 9]
b
# (0, [9, 9], 3)
+
、*
、in
和列表一样。
a = (1, 2, 3)
len(a) # 3 元素个数
max(a) # 3 最大值
min(a) # 1 最小值
sum(a) # 6 求和
a.count(1) # 1 求元素的个数
a.index(2) # 1 指定元素位置
for i in a: print(i) # 迭代元素
sorted(a) # 返回一个排序的列表,但不改变原列表
any(a) # True 是否至少有一个元素为真
all(a) # True 是否所有元素为真
tuple.__dir__('') # 查看元组支持的所有函数和方法
可将元组利用推荐式生成列表,也可用以下方式生成元组:
t = tuple((i for i in range(3)))
# t: (0, 1, 2)
在「变量」一节里我们说过可以利用元组 a,b,c,d = 1,2,3,4
批量定义变量,我们也可以用以下方法更加灵活地定义变量。可以想象当一个包里的东西很多,但是分的人不够,指定的人占的多一些:
x = (1,2,3,4,5)
a, *b = x # a 占第一个,剩余的组成列表全给 b
# a -> 1
# b -> [2, 3, 4, 5]
# a, b -> (1, [2, 3, 4, 5])
a, *b, c = x # a 占第一个,c 占最后一个, 剩余的组成列表全给 b
# a -> 1
# b -> [2, 3, 4]
# c -> 5
# a, b, c -> (1, [2, 3, 4], 5)
在访问元组数据的时候我们发现,要取指定的数据需要知识它所在的索引位置,不是很方便。命名元组可以解决这个问题,如:
from collections import namedtuple
Girl = namedtuple('Girl', ['name', 'age'])
lily = Girl('lily', 10)
lily.name # lily
lily.age # 10
lily
# Girl(name='lily', age=10)
type(lily)
# __main__.Girl
# 不能被修改
lily.age = 12
# AttributeError: "can't set attribute"
命名元组使用时需要导入内置包,使用类(后边有讲解)的方法进行初始化和调用。和元组的特性一样,命名元组不能被修改。
详见:namedtuple() 。
圆括号(注:它不是元组)的字符串仍然是一个字符:
('b' 'c')
('b''c')
('bc') # 特别注意
# 'bc'
如果想定义一个单元素的元组,需要加一个逗号:
('b' 'c',)
('b''c',)
('bc',)
# ('bc',)
type(('bc',))
# tuple
另一个陷阱是,可以使用 tuple() 函数来使用显式元组构造函数。这确实会创建一个元组对象,但当向该函数传递字符串时,它会为每个项创建一个具有一个字符的元组:
tuple("abc")
# ('a', 'b', 'c')
请注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。 例如,f(a, b, c) 是在调用函数时附带三个参数,而 f((a, b, c)) 则是在调用函数时附带一个三元组。以下方式都可以构建一个元组:
元组实现了所有 一般 序列 的操作。
直接用逗号构造元组的方法是 Python 表达式列表,参见:Python 表达式列表 。
对于通过名称访问相比通过索引访问更清晰的异构数据多项集,collections.namedtuple() 可能是比简单元组对象更为合适的选择。
更新时间:2024-05-18 16:43:49 标签:python 元组