文章目录
第8章 元组(tuple)
元组(Tuple)是Python提供的一种数据类型,它的结构与列表完全相同,但是元组与列表最大的区别在于:元组的元素值不可更改,元素个数不可变动
。因此元组也被称为不可改变的列表。
8.1 元组的定义
列表在定义时是将元素放在中括号“[]”内,而元组的定义则是将元素放在小括号“()”内。元组的语法格式如下:
name_tuple = (元素1, 元素2, ..., 元素n,) # name_tuple是假设的元组名称
元组中的每一组数据称为元素
,元素可以是整数
、字符串
或列表
等,这些元素放在小括号“()”内,彼此之间用逗号“,”隔开,最右边的“,”可有可无。使用print()函数,将元组名称作为变量名称,可打印元组内容。如果元组内的元素只有一个,在定义时需要在元素的右边加上逗号“,”,如:tuple = (13,)
程序实例:
# 定义与打印元组
numbers = (1, 2, 3, 4, 5,) # 定义元组元素是整数
fruits = ('apple', 'banana', 'orange') # 定义元组元素为字符串
mixed = ('price', 30) # 定义元组元素为不同类型的数据
val_tuple = (18,) # 只有一个元素的元组
print(numbers, type(numbers))
print(fruits, type(fruits))
print(mixed, type(mixed))
print(val_tuple, type(val_tuple))
执行结果:
(1, 2, 3, 4, 5) <class 'tuple'>
('apple', 'banana', 'orange') <class 'tuple'>
('price', 30) <class 'tuple'>
(18,) <class 'tuple'>
8.2 读取元组元素
读取元组内容的方式与列表一样,都是使用中括号。元组元素的索引值从0开始,如要读取元组的第1个元素,则使用元组名称[0],读取索引值为i的元组元素则使用元组名称[i]。
程序实例:
# 读取元组元素
numbers = (1, 2, 3, 4, 5) # 定义元组元素是整数
fruits = ('apple', 'banana', 'orange') # 定义元组元素为字符串
mixed = ('price', 30) # 定义元组元素为不同类型的数据
val_tuple = (18,) # 只有一个元素的元组
print(numbers[1])
print(fruits[2])
print(mixed[1])
print(val_tuple[0])
执行结果:
2
orange
30
18
8.3 遍历所有元组元素
在Python中可以使用for循环遍历所有元组元素,用法与列表相同。
程序实例:
# 遍历元组元素
tuple1 = ('apple', '10086', 38, ['php', 'java', 'python'])
for t in tuple1:
print(t)
执行结果:
apple
10086
38
['php', 'java', 'python']
8.4 修改元组内容
元组元素内容是不可更改的,更改元组元素内容会发生错误。
程序实例:
fruits = ('orange', 'pear', 'peach') # 定义元组元素是字符串
print(fruits[1]) # 打印元组fruits[0]
fruits[0] = 'banana' # 将元素内容更改为banana
print(fruits[0])
执行结果:
上述最后一行错误信息TypeError指出:tuple对象不支持赋值,相当于不可更改它的元素值。
元组内的直接数据如果修改则会立即报错,但是如果元组里面有列表,修改列表里面的数据是允许的。
# 元组内的直接数据如果修改则会立即报错,但是如果元组里面有列表,修改列表里面的数据是允许的
tuple2 = (1, 2, ['a', 'b', 'c'], 3, 6)
print(tuple2) # (1, 2, ['a', 'b', 'c'], 3, 6)
tuple2[2].extend(['d', 'n', 'f'])
print(tuple2) # (1, 2, ['a', 'b', 'c', 'd', 'n', 'f'], 3, 6)
如果要修改元组元素,只能使用重新定义元组的方式进行处理。
程序实例:
fruits = ('apple', 'banana', 'orange')
print("原始fruits元组元素:")
for fruit in fruits:
print(fruit)
fruits = ('orange', 'cherry', 'peach') # 定义新的元组元素
print("\n新的fruits元组元素:")
for fruit in fruits:
print(fruit)
执行结果:
原始fruits元组元素:
apple
banana
orange
新的fruits元组元素:
orange
cherry
peach
8.5 元组切片(tuple slices)
元组切片的概念与列表切片相同,即根据某些规则,取元组内容的一部分。常用语法格式如下:
name_tuple[start:end] # 读取从索引start到(end-1)索引的列表元素
name_tuple[:n] # 取得列表前n名
name_tuple[n:] # 取得列表索引n到最后
name_tuple[-n:] # 取得列表后n名
name_tuple[:] # 取得所有元素
name_tuple[start:end:step] # 每隔step,读取从索引start到(end-1)索引的列表元素
程序实例:
# 元组切片的应用
fruits = ('apple', 'banana', 'cherry', 'orange', 'pear', 'watermelon')
print(fruits[0:3])
print(fruits[:3])
print(fruits[2:])
print(fruits[-4:])
print(fruits[:])
print(fruits[1:6:2])
执行结果:
('apple', 'banana', 'cherry')
('apple', 'banana', 'cherry')
('cherry', 'orange', 'pear', 'watermelon')
('cherry', 'orange', 'pear', 'watermelon')
('apple', 'banana', 'cherry', 'orange', 'pear', 'watermelon')
('banana', 'orange', 'watermelon')
8.6 方法与函数
应用在列表上的方法或函数如果不会更改列表内容,则可以将它应用在元组。如len() index()、count()。会更改列表内容的则不能应用到元组中,如:append()、insert()和pop()。
# 元组数据不支持修改,只支持查找
# 1.按下标查找数据
tuple1 = ('java', 'php', 'c', 'c++', 'python', 'c#', 'go')
print(tuple1[2]) # c
# 2.index():查找某个数据,如果数据存在,返回对应的下标,否则报错。
print(tuple1.index('c')) # 2
# 3.count():统计某个字符在当前元组出现的次数
print(tuple1.count('c')) # 1
# 4.len():返回元组数据个数
print(len(tuple1)) # 7
8.7 列表与元组数据互转
在程序设计过程中,如果需要将列表(list)与元组(tuple)数据类型相互转换,可使用下列指令。
list():将元组数据类型转换成列表
tuple():将列表数据类型转换成元组
程序实例:
# 元组与列表相互转换
list1 = ['apple', 'banana', 'orange', 10086]
tuple1 = (110, 120, '119', '永不毕业的李华')
print(list1, type(list1))
print(tuple1, type(tuple1))
tuple1_list = list(tuple1) # 将元组改为列表
tuple1_list.append('法外狂徒张三') # 添加元素
print(tuple1_list, type(tuple1_list))
list1_tuple = tuple(list1) # 将列表改为元组
print(list1_tuple, type(list1_tuple))
list1_tuple.pop()
执行结果:
元组内建方法max()、min()的应用:
tup = (1, 3, 5, 7, 9)
print("元组tup中的最大值:%d" % max(tup))
print("元组tup中的最小值:%d" % min(tup))
执行结果:
元组tup中的最大值:9
元组tup中的最小值:1
8.8 元组的优点
- 可以更安全地保护数据
程序设计中,可能会遇到有些数据永远都不会改变的情况,将它存储在元组内,可以更安全地保护这些数据。如:图像处理时对象的长、宽或每一像素的色彩数据等。
- 加快程序执行速度
元组结构比列表简单,占用系统资源较少,程序执行速度较快。
divmod()函数的用法:
商,余数 = divmod(被除数, 除数)
divmod()函数的返回值其实是元组,所以可使用元组方式取得商和余数。
程序实例:
dist = 384400
speed = 1225
total_hours = dist // speed # 小时数
data = divmod(total_hours, 24)
print("divmod()函数返回的数据及数据类型:",data, type(data))
print("商:", data[0])
print("余数:",data[1])
执行结果:
divmod()函数返回的数据及数据类型: (13, 1) <class 'tuple'>
商: 13
余数: 1
往期文章: