第八章 python 元组

it2024-05-09  48

第八章 python 元组

在大型的商业或游戏网站设计中,列表是非常重要的数据类型,因为记录各种等级客户,游戏角色等,皆需要使用列表,列表数据可以随时变动更新,python 提供另一种数据类型称元组,这种数据类型结构与列表完全相同,但是它与列表最大的差异是,它的元素个数不可更改,有时又称不可改变的列表,这也是本章主题。

8-1 元组的定义

列表在定义时是将元素放在中括号内,元组的定义则是将元素放在小括号 “()”内,下列是元组的语法格式。

name_tuple = ( 元素 1,…,元素 n ) #name_tuple 是假设的元组名称

基本上元组的每一个数据称元素,元素可以是整数、字符串或列表等,这些元素放在小括号()内,彼此用逗号 “,” 隔开。如果要打印元组内容,可以用 print() 函数,将元组名称当作变量名称即可。

如果元组内的元素只有一个,在定义时需在元素右边加上逗号“,”。

name_tuple = ( 元素1 , ) #只有一个元素的元组

例:定义与打印元组,最后使用 type() 列出元组数据类型

numbers1 = (1,2,3,4,5) # 定义元组元素是整数 fruits = ('apple','orange') # 定义元组元素是字符串 mixed = ('James',50) # 定义元组元素是不同类型数据 val_tuple =(10,) # 只有一个元素的元组 print(numbers1) print(fruits) print(mixed) print(val_tuple) print("元组mixed的数据类型是",type(mixed)) #输出结果 (1, 2, 3, 4, 5) ('apple', 'orange') ('James', 50) (10,) 元组mixed的数据类型是 <class 'tuple'>

8-2 读取元组元素

定义元组时是使用小括号 “()”,如果想要读取元组内容,和列表是一样的,用中括号 “ [ ] ”。在 python 中元组元素是从索引值 0 开始配置,所以如果是元组的第一个元素,索引值是 0,第二个元素索引值是 1,其他依次类推,如下所示:

numbers1 = (1,2,3,4,5) # 定义元组元素是整数 fruits = ('apple','orange') # 定义元组元素是字符串 val_tuple =(10,) # 只有一个元素的元组 print(numbers1[0]) print(numbers1[4]) print(fruits[0]) print(fruits[1]) print(val_tuple[0]) #输出结果 1 5 apple orange 10

8-3 列出所有元组元素

在 python 可以使用 for 循环遍历所有元组元素。

例:假设元组是由字符串和数值组成的密码,这个程序会列出元组所有元素内容。

keys = ('magic','xaab',9099) #定义元组元素是字符串与数字 for key in keys: print(key) #输出结果 magic xaab 9099

8-4 修改元组内容产生错误的实例

本章前言笔者已经说明元组元素内容是不可更改的,下列是尝试更改元组元素内容的错误实例。

例:修改元组内容产生错误的实例。

fruits = ('apple','orange') print(fruits[0]) fruits[0] = 'watermelon' print(fruits[0]) #输出结果 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-82516c059142> in <module> 1 fruits = ('apple','orange') 2 print(fruits[0]) ----> 3 fruits[0] = 'watermelon' 4 print(fruits[0]) TypeError: 'tuple' object does not support item assignment 上述最后一行错误信息 TypeError 指出 tuple 对象不支技赋值,相当于不可更改它的元素值。

8-5 可以使用全新定义方式修改元组元素

如果我们想修改元组元素,可以使用重新定义元组方式处理。

例:用重新定义方式修改元组元素内容。

fruits = ('apple','orange') #定义元组元素是水果 print('原始 fruits 元组元素') for fruit in fruits: print(fruit) fruits = ('watermelon','grape') #定义新的元组元素 print('\n新的 fruits 元组元素') for fruit in fruits: print(fruit) #输出结果 原始 fruits 元组元素 apple orange 新的 fruits 元组元素 watermelon grape

8-6 元组切割

元组切片观念与 6-1-3 节列表切片观念相同,下列将直接用程序实例说明

例:元组切片的应用

fruits = ('apple','orange','banana','watermelon','grape') print(fruits[1:3]) print(fruits[:2]) print(fruits[1:]) print(fruits[-2:]) print(fruits[0:5:2]) #输出结果 ('orange', 'banana') ('apple', 'orange') ('orange', 'banana', 'watermelon', 'grape') ('watermelon', 'grape') ('apple', 'banana', 'grape')

8-7 方法与函数

应用在列表上的方法或函数如果不会更改元组内容,则可以将它应用在元组,如 len()。如果会更改元组内容,则不可以将它应用在元组,如 append()、insert() 或 pop()。

例:列出元组元素长度(个数)。

keys = ('magic','xaab',9909) key = keys.pop() #输出结果 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-8-d89480eea8e8> in <module> 1 keys = ('magic','xaab',9909) ----> 2 key = keys.pop() AttributeError: 'tuple' object has no attribute 'pop' 上述指出错误是不支持 pop(),这是因为 pop() 将造成元组元素减少。

例:误用会增加元组元素的方法 append(),产生错误的实例。

keys = ('magic','xaab',9909) keys.append('secret') #输出结果 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-9-5af41be2664c> in <module> 1 keys = ('magic','xaab',9909) ----> 2 keys.append('secret') AttributeError: 'tuple' object has no attribute 'append'

8-8 列表与元组数据互换

程序设计过程,也许会有需要将列表与元组数据类型互换,可以使用下列指令。

list():将元组数据类型改为列表tuple():将列表数据类型改为元组

例:将元组改为列表的测试

keys = ('magic','xaab',9909) list_keys = list(keys) list_keys.append('secret') print("打印元组 ",keys) print("打印列表 ",list_keys) #输出结果 打印元组 ('magic', 'xaab', 9909) 打印列表 ['magic', 'xaab', 9909, 'secret'] 上述第 4 行由于 list_keys 已经是列表,所以可以使用 append() 方法。

例:将列表改为元组的测试。

keys = ['magic','xaab',9909] tuple_keys = tuple(keys) print("打印列表 ",keys) print("打印元组 ",tuple_keys) tuple_keys.append('secret') #输出结果 打印列表 ['magic', 'xaab', 9909] 打印元组 ('magic', 'xaab', 9909) --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-12-631b3dc822f2> in <module> 3 print("打印列表 ",keys) 4 print("打印元组 ",tuple_keys) ----> 5 tuple_keys.append('secret') AttributeError: 'tuple' object has no attribute 'append' 上述前 5 行程序是正确的,所以可以看到有分别打印列表和元组元素,程序第 6 行的错误是因为 tuple_keys 是元组,不支持使用 append() 增加元素。

8-9 元组的功能

方法说明max ( tuple )获得元组内容最大值

例:元组内建方法 max()、min() 的应用。

tup = (1,3,5,7,9) print("tup 最大的值是",max(tup)) print("tup 最小的值是",min(tup)) #输出结果 tup 最大的值是 9 tup 最小的值是 1

8-10 enumerate 对象使用在元组

在 6 - 11 与 7 - 5 节皆已有说明,在此笔者直接以实例解说。

例:将元组转成 enumerate 对象,再转回元组对象

drinks = ("coffee","tea","wine") enumerate_drinks = enumerate(drinks) # 数值初始是 0 print("转成元组输出,初始值是 0 :",tuple(enumerate_drinks)) enumerate_drinks = enumerate(drinks,start = 10) # 数值初始是 10 print("转成元组输出,初始值是 10 :",tuple(enumerate_drinks)) #输出结果 转成元组输出,初始值是 0((0, 'coffee'), (1, 'tea'), (2, 'wine')) 转成元组输出,初始值是 10((10, 'coffee'), (11, 'tea'), (12, 'wine'))

8-11 zip()

这是一个内置函数,参数内容主要是可迭代的对象,如列表等,然后将相对应的元素打包成元组,最后传给 zip 对象,我们可以使用 list() 函数将 zip 对象转成列表。

例:zip() 的应用

fields = ['Name','Age','Hometown'] info = ['peter','30','Chicago'] zipData = zip(fields,info) print(type(zipData)) player = list(zipData) print(player) #输出结果 <class 'zip'> [('Name', 'peter'), ('Age', '30'), ('Hometown', 'Chicago')]

如果放在 zip() 函数的列表参数长度不相等,由于多出的元素无法匹配,转成列表对象后 zip 对象元素数量将是较短的数量。

例:fields 列表元素数量个数是 3 个,info 列表元素数量个数只有 2 个,最后 zip 对象元素数量是 2 个

fields = ['Name','Age','Hometown'] info = ['peter','30'] zipData = zip(fields,info) print(type(zipData)) player = list(zipData) print(player) #输出结果 <class 'zip'> [('Name', 'peter'), ('Age', '30')]

如果在 zip() 函数内增加 " * " 符号,相当于可以 unzip() 列表。

例:扩充上面例子,恢复 zip 前的列表

fields = ['Name','Age','Hometown'] info = ['peter','30','Chicago'] zipData = zip(fields,info) print(type(zipData)) player = list(zipData) print(player) f,i = zip(*player) print("fileds:",f) print("info:",i) #输出结果 <class 'zip'> [('Name', 'peter'), ('Age', '30'), ('Hometown', 'Chicago')] fileds: ('Name', 'Age', 'Hometown') info: ('peter', '30', 'Chicago')

8-12 元组的功能

读者也许好奇,元组的数据结构与列表相同,但是元组有不可更改元素内容的限制,为何 python 要有类似但功能即受限的数据结构存在?原因是元组有下列优点: 可更安全地保护数据: 程序设计中可能会碰上有些数据是永远不会改变的情况,将它存储在元组内,可以安全地被保护。例如,电子邮件的数据结构,图像处理时对象的长,宽或每一像素的色彩数据,很多是以元组为数据类型。 增加程序执行速度: 元组结构比列表简单,占用较少的系统资源,程序执行时速度比较快。 当了解了上述元组的优点后,其实未来设计程序时,如果确定数据可以不更改,就尽量使用元组数据类型吧!
最新回复(0)