第八章 元组(元组的定义与元素读取、元组切片、元组和列表转换、元组和enumerate对象、zip函数打包成元组)
列表数据可以随时变动更新。Python提供另一种数据类型称元组(tuple),这种数据类型结构与列表完全相同,但是它与列表最大的差异是,它的元素值与元素个数不可更改,有时又可称不可改变的列表。与列表相比,元组具有下列优点:
- 可以更安全地保护数据。程序设计中可能会碰上有些数据是永远不会改变的情况,将它存储在元组(tuple)内,可以安全地被保护。
- 增加程序执行速度。元组(tuple)结构比列表(list)简单,占用较少的系统资源,程序执行时速度比较快。
未来设计程序时,如果确定数据可以不更改,就尽量使用元组数据类型吧!
一、元组的定义。元组的定义是将元素放在小括号“( )”内,下列是元组的语法格式:name_tuple = (元素1, ..., 元素n)。基本上元组的每一个数据称元素,元素可以是整数、字符串或列表等,这些元素放在小括号( )内,彼此用逗号“,”隔开。如果元组内的元素只有一个,在定义时需在元素右边加上逗号“,”:
name_tuple = (元素1,)
如果想要读取元组内容,和列表是一样的,用中括号“[ ]”。在Python中元组元素是从索引值0开始配置。所以如果是元组的第一个元素,索引值是0,第二个元素索引值是1,其他依次类推:
name_tuple[i] 。
和列表一样,在Python可以使用for循环遍历所有元组元素:
nums = (1, 2, 3)
for n in nums:
print(n)
二、元组切片。元组切片概念与列表切片概念相同,就是取元组内某个区间的元素:
fruits = ('apple', 'organe', 'banana', 'watermelon', 'grape')
print(fruits[1:3])
print(fruits[:2])
print(fruits[1:])
print(fruits[-2:])
print(fruits[0:5:2])
应用在列表上的方法或函数如果不会更改元组内容,则可以将它应用在元组,如len( )。如果会更改元组内容,则不可以将它应用在元组,如append( )、insert( )或pop( )。max(name_tuple)表示获取元组内容最大值,min(name_tuple)表示获取元组内容最小组。
三、元组和列表转换。程序设计过程,有时候会需要将列表(list)与元组(tuple)数据类型互换,list(name_tuple) 将元组类型改为列表,tuple(name_list) 将列表类型改为元组:
keys = ('magic', 'xaab', 9099)
list_keys = list(keys)
list_keys.append('secret') #list_keys是列表,可以使用append方法
print("打印元组:", keys)
print("打印列表:", list_keys)
print()
keys = ['magic', 'xaab', 9099]
tuple_keys = tuple(keys)
print("打印列表:", keys)
print("打印元组:", tuple_keys)
tuple_keys.append('secret') #tuple_keys是元组,增加元素会报错
元组和enumerate对象同样可以互相转换:
drinks = ('coffee', 'tea', 'wine')
enum_drinks = enumerate(drinks)
print("转成元组输出,初始值为0: ", tuple(enum_drinks))
enum_drinks = enumerate(drinks, 10)
print("转成元组输出,初始值为10:", tuple(enum_drinks))
enum_drinks = enumerate(drinks)
for drink in enum_drinks:
print(drink)
enum_drinks = enumerate(drinks, 10)
for count, drink in enum_drinks:
print(count, drink)
四、zip()函数打包成元组。Python有一个内置函数zip(),参数内容主要是可迭代(iterable)的对象,如列表、元组等。然后将相对应的元素打包成元组(tuple),最后传给zip对象,我们可以使用list( )函数将zip对象转成列表。如果放在zip( )函数的列表参数长度不相等,由于多出的元素无法匹配,转成列表对象后zip对象元素数量将是较短的数量。如果在zip( )函数内增加“*”符号,相当于可以unzip( )列表:
num = (1, 2, 3, 4, 5)
fruits = ('apple', 'banana')
prices = [6.6, 8.8, 9.9]
zipdata = zip(num, fruits, prices) #执行zip
print(type(zipdata)) #打印zip数据类型
ziplists = list(zipdata) #将zip数据转成列表
#zip对象内部元素是元组,元组个数等于三个可迭代对象中个数最少的那个
print(ziplists)
zipdata = zip(num, fruits, prices) #执行zip
ziptuples = tuple(zipdata) #将zip数据转成元组
print(ziptuples)
zipdata = zip(num, fruits, prices) #执行zip
a, b, c = zip(*zipdata) #执行unzip
print("num: ", a)
print("fruits: ", b)
print("prices:", c)
这里需要注意:enumerate()和zip()方法生成的对象,如果使用list()或者tuple()转为列表或元组之后,该对象就为空了,不能第二次再使用list或tuple做转换了。这就是上面两端代码每次做转换或者打印输出的时候都要重新再执行一遍enumarate()或zip()方法