Python 元组(Tuple)也是一种有序序列,一旦建立之后,元组中的元素个数与内容值不能被任意更改,所以我们也称元组是不能更改的序列,这一点和列表内容可以变动是有所不同的。
简单来说,当元组建立之后,绝对不能变动每个索引值所指向的元素。
我们知道列表是用中括号[ ]来存放元素的,而元组却是用小括号( )来存放元素的。
元组可以存放不同数据类型的元素,因为元组内的元素有与之对应的索引值,所以可以使用 for 循环或 while 循环来读取元组内的元素,语法如下:
元组名称=( 元素1,元素2,…)
Python 语法相当具有弹性,在建立元组数据类型时可以不指定名称,甚至允许将括号直接省略,以下为 3 种建立元组的方式。
('733254', 'Andy', 178) #建立时没有名称
tupledata = ('733249', 'Michael', 185) #有名称的元组
data = '733249', 'Michael', 185 #无小括号,也是元组
即使元组里只有一个元素,都必须在元素之后加上逗号,例如下面的代码。
obj = ("Microwave",)
元组中可以存放不同数据类型的元素,而且每个元素的索引值左边从 0 开始,右边则从 -1 开始。由于元组内的元素有对应的索引值,因此可以使用 for 循环或 while 循环来读取元素。
【示例1】新建元组,用 for 循环将元组中的元素输出,其中 len() 函数可以求取元组的长度。代码如下:
tup = (28, 39, 58, 67,97, 54)
print('目前元组内的所有元素:')
for item in range(len(tup)):
print ('tup[%2d] %3d' %(item, tup[item]))
输出结果:
目前元组内的所有元素:
tup[ 0] 28
tup[ 1] 39
tup[ 2] 58
tup[ 3] 67
tup[ 4] 97
tup[ 5] 54
虽然存储在元组中的元素的值不可以用 “[]” 运算符来改变,但是元组内的元素仍然可以利用 “+” 运算符将两个元组的数据内容连接成一个新的元组,而 “*” 运算符可以复制元组的元素,例如下面的代码。
>>> (1,5,8)+(9,4,2)
(1, 5, 8, 9, 4, 2)
>>> (3,5,6)*3
(3, 5, 6, 3, 5, 6, 3, 5, 6)
>>>
>>> (1,5,8)+(9,4,2)
(1, 5, 8, 9, 4, 2)
>>> (3,5,6)*3
(3, 5, 6, 3, 5, 6, 3, 5, 6)
>>>
此外,切片运算也可以应用于元组来取出若干元素。
若要取出指定范围的若干元素,使用正值就正向(由左而右)取出元素,使用负值就负向(由右而左)取出元素。以下例子说明了各种元组切片运算的语法。
>>> (1,5,8)+(9,4,2)
(1, 5, 8, 9, 4, 2)
>>> (3,5,6)*3
(3, 5, 6, 3, 5, 6, 3, 5, 6)
>>> tup =(90,43,65,72,67,55)
>>> tup[3]
72
>>> tup[-3]
72
>>> tup[1:4]
(43, 65, 72)
>>> tup[-6:-2]
(90, 43, 65, 72)
>>> tup[-1:-3] #无法正确取得元素
()
>>>
简单来说,当元组建立之后,绝对不能变动每个索引值所指向的元素。
一般而言,列表的大部分函数在元组中都可以使用,但是那些会改变元素个数或元素值的函数不可以使用,如 append()、insert() 等函数。
但是像 count() 函数(用来统计特定元素出现的次数)或是 index() 函数(用来取得某元素第一次出现的索引值)等就可以应用于元组。以下介绍常用的元组函数。
sum() 函数:用来计算总和。
bonus= (900,580,850,480,800,1000,540,650,200,100) #建立元组来存放红利积点
print('所有红利积点', sum(bonus), ', 平均红利点数 = ', sum(bonus)/10)
输出结果:
所有红利积点 6100 , 平均红利点数 = 610.0
max() 函数:返回元组中最大的元素,例如下面的代码。
>>> max((89,32,58,76))
89
>>> max((89,32,58,76))
89
min() 函数:返回元组中最小的元素,例如下面的代码。
>>> min((89,32,58,76))
32
【示例2】利用 sorted() 函数来对元组内的元素进行排序。Python 代码如下:
salary = (86000, 72000, 83000, 47000, 55000)
print('原有数据:')
print(salary)
print('--------------------------------')
# 由小而大
print('薪资由低到高排序:',sorted(salary))
print('--------------------------------')
# 递减排序
print('薪资由高到低排序:', sorted(salary, reverse = True))
print('--------------------------------')
print('元素经排序后仍保留原数据位置:')
print(salary)
print('--------------------------------')
输出结果:
原有数据:
(86000, 72000, 83000, 47000, 55000)
--------------------------------
薪资由低到高排序: [47000, 55000, 72000, 83000, 86000]
--------------------------------
薪资由高到低排序: [86000, 83000, 72000, 55000, 47000]
--------------------------------
元素经排序后仍保留原数据位置:
(86000, 72000, 83000, 47000, 55000)
--------------------------------
程序解说:
Python 针对元组有个很特别的用法,即解包。
举例来说,下列第一行语句将 “happy” “cheerful” “flexible” “optimistic” 这些值定义为元组,第二行语句则使用变量取出元组中的元素,称为解包。
解包不只限于元组,还包括列表、集合等序列,但重点是将序列解包的等号左边的变量个数必须与等号右边的序列元素数量相同,例如下面的代码。
wordlist = ("happy", "cheerful", "flexible", "optimistic")
w1, w2, w3, w4=wordlist # Unpacking
print(w3) #输出 flexible
print(type(w3)) # <class 'str'>
在其他程序语言中,如果想要交换(Swap)两个变量的值,通常需要第三个变量来辅助。如 x=100、y=58,如果要让 x 与 y 的值对调,以 C 语言为例,其程序代码如下。
temp = x;
x = y;
y = temp;
Python 的解包特性则可以简化变量值交换的工作,只要一行语句就可以完成上述数据交换工作,代码如下。
y,x = x,y
【示例3】数据交换的 Python 代码如下:
x = 859
y = 935
print("两数经交换前的值: ")
print('x={},y={}'.format(x,y))
y,x = x,y
print("两数经交换后的值: ")
print('x={},y={}'.format(x,y))
输出结果:
两数经交换前的值:
x=859,y=935
两数经交换后的值:
x=935,y=859
第 5 行:利用解包的特性,变量值交换只要一行程序代码就可以完成。
【示例4】列表交换,通过 for 循环结合解包的特性,来辅助个人数据的分析或进一步的处理工作。代码如下:
info = [['C语言程序设计','朱大峰','480'],['Python程序设计','吴志明','500'],['Java程序设计','许伯如','540']]
for(book, author,price) in info:
print('%10s %3s'%(book,author),' 书籍定价:',price)
输出结果:
C语言程序设计 朱大峰 书籍定价: 480
Python程序设计 吴志明 书籍定价: 500 Java程序设计 许伯如 书籍定价: 540
程序解说: