Python 元组
元组
定义
列表 与 元组 都可以用来存储一系列元素
列表可以动态地修改元素以及列表组成,虽然元组也能存储一堆元素,但是不可以动态地修改其元素的值,所以元组适合存储一些在整个程序生命周期中都不会改变的值
与列表不同,元组使用 圆括号() 标识
>>> example = (10, 20)
>>> print(example)
(10, 20)
若直接输出打印元组,与列表一样,都会 打印元组的内部表示
单元素元组的歧义问题
注意:元组若只包含一个元素,容易产生歧义
为了消除这个歧义,需要在这个元素后面添加逗号以区分
方式:变量 = (元素, )
>>> a = (1)
>>> type(a)
<class 'int'>
>>> a = (1, )
>>> type(a)
<class 'tuple'>
若不消除歧义,则可能变量被解释为其他类型
空元组
空元组定义为: 变量 = ()
>>> student = ()
>>> type(student)
<class 'tuple'>
定义元组的其他方式
若定义变量时,直接用逗号隔开,默认为元组:
>>> a = 'Hello', 'World', '123'
>>> type(a)
<class 'tuple'>
>>> print(a)
('Hello', 'World', '123')
访问元组的值
访问元组的方式与列表一样,都使用 索引 访问元组的元素
方式:元组名[索引]
>>> example = (10, 20)
>>> print(example[0])
10
>>> print(example[1])
20
定义声明元组使用的是 圆括号,而定义声明列表使用的是 方括号
但是访问两者各自元素时,都是通过 方括号 来存放 索引,并且在方括号前指名 元组名或列表名
>>> cars = ['honda', 'toyota', 'bmw']
>>> print(cars[0])
honda
>>> food = ('rice', 'ice cream')
>>> print(food[0])
rice
遍历元组
使用 for循环 遍历元组
>>> student = ('David', 'Bob', 'Mary', 'Lisa')
>>> for i in student:
... print(i)
...
David
Bob
Mary
Lisa
从整体上修改元组
若直接修改元组内元素的值,会被提示 类型错误 TypeError
>>> examples = (10, 20)
>>> examples[0] = 15
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
由于不能以赋值的方式修改元组内单个元素,所以若要修改元组时,需要重新定义整个元组,即 给存储元组的变量赋值,定义一个新元组赋值给存储原元组的变量
>>> print("Original")
Original
>>> examples = (20, 10)
>>> for i in examples:
... print(i)
...
20
10
>>> examples = (30, 10)
>>> for i in examples:
... print(i)
...
30
10
关键:给存储元组的变量重新赋值
元组无法动态地 增、删,也不能在使用中对单个元素进行修改,所以只能通过对 存储元组的变量 重新赋值的方式,从整体上来修改元组,因为元组无法像列表一样动态的改变
元组复制
可以使用 星号(*) 实现复制
>>> a = ('Hello', 'World', '123')
>>> b = a * 2
>>> print(b)
('Hello', 'World', '123', 'Hello', 'World', '123')
若直接将元组变量赋值给另外一个元组变量,与列表不同,这里的复制是真的复制了一个新的元组
>>> a = (1, 2, 3)
>>> b = a
>>> print(a)
(1, 2, 3)
>>> print(b)
(1, 2, 3)
>>> a = (2, 3, 4)
>>> print(a)
(2, 3, 4)
>>> print(b)
(1, 2, 3)
在列表中,如果使用这种复制方式,实现的效果是两个变量指向同一个列表,而此处 a 与 b 元组是完全不同的两个元组
删除元组
可以使用 del语句 删除整个元组,元组内部的元素是不能删除的
>>> examples = (1, 2)
>>> del examples
>>> examples
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'examples' is not defined
元组连接组合
元组之间是可以进行连接的,通过 加号(+) 进行连接
>>> men = ('David', 'Bob')
>>> women = ('Mary', 'Lisa')
>>> student = men + women
>>> print(student)
('David', 'Bob', 'Mary', 'Lisa')
切片操作
切片操作在元组内也适用
>>> student = ('David', 'Bob', 'Mary', 'Lisa')
>>> student[1:3]
('Bob', 'Mary')
与列表中的切片使用类似:[第一个元素 : 第二个元素]
- 若两个元素都指定,从第一个元素开始,一直到第二个元素(不包含第二个元素)
- 若第一个元素未指定,则表示从元组第一个元素开始
- 若第二个元素未指定,则表示从第一个元素开始一直到最后一个元素
- 若第一个元素、第二个元素都未指定,则表示整个元组
- -1表示最后一个元素,同理 -2表示倒数第二个元素
- 若元组为空,则无法访问 -1,会报索引错误
>>> student = ()
>>> type(student)
<class 'tuple'>
>>> print(student[-1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
获取元组长度
使用函数 len() 可以获取元组的长度
>>> student = ('Bob', 'Sean', 'Lisa', 'Jack')
>>> print(len(student))
4
元组输出格式调整
- title() 首字母大写
- lower() 全小写
- upper() 全大写
>>> student = ('Bob', 'Sean', 'Lisa', 'Jack')
>>> for i in student:
... print(i.title())
... print(i.lower())
... print(i.upper())
...
Bob
bob
BOB
Sean
sean
SEAN
Lisa
lisa
LISA
Jack
jack
JACK
列表转元组函数
使用函数 tuple(),参数为 要转化的列表
>>> cars = ['bmw', 'audi', 'toyota', 'honda']
>>> type(cars)
<class 'list'>
>>> tup_cars = tuple(cars)
>>> print(tup_cars)
('bmw', 'audi', 'toyota', 'honda')
>>> type(tup_cars)
<class 'tuple'>
数字元组
可以使用 range()函数 与 tuple()函数,生成数字元组
>>> tup1 = tuple(range(1, 6))
>>> type(tup1)
<class 'tuple'>
>>> print(tup1)
(1, 2, 3, 4, 5)
元组统计函数
- min()
- max()
- sum()
min()、max()对于字符串、数字元组都可以使用,而 sum() 只用于数字元组
>>> tup1 = tuple(range(1, 6))
>>> min(tup1)
1
>>> max(tup1)
5
>>> sum(tup1)
15
元组查找操作
若知道要查找的值,可以使用函数 index(),参数是要查找的值
>>> tup1 = tuple(range(1, 6))
>>> print(tup1.index(1))
0
统计查找的值在元组中出现了多少次,可以使用函数 count(),参数是要统计的值
>>> tup = (1, 1, 1, 2, 2, 3, 4, 5)
>>> print(tup.count(1))
3
>>> print(tup.count(2))
2
>>> print(tup.count(3))
1