元组(tuple)是python中另一个重要的序列结构,与列表类似,也是由一系列按特定顺序排列的元素组成的,但是他是不可变序列,因此元组也可以称为不可变的列表。在形式上,元组的所有元素都放在一对小括号“()”中,两个相邻元素间使用逗号“,”进行分割。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入元组中,并且同一个元组中,元素的类型可以不同,因为它们之间没有任何关系。在通畅情况下,元组用于保存程序中不可修改的内容。
说明:从元组和列表的定义上看,这两个结构比较相似,它们之间的区别就是一个是可变序列,一个是不可变序列,即元组的元素不可以单独修改,而列表则可以任意修改。
一、元组的创建和删除
在python中提供了多种创建元组的方法,下面分别进行介绍。
1、使用赋值运算符直接创建元组
同其它类型的python变量一样,创建元组时,也可以使用赋值运算的“=”直接讲一个元组复制给变量。具体的语法格式如下:
tuplename = (element 1,element 2,element 3,element 4)
其中tuplename表示元组的名称,可以是任何符合python命名规则的表示服;element1,2,3,4表示元组的元素,个数没有限制,并且只要是python支持的类型就可以。
注意:创建元组和创建列表的语法类似,只是创建列表时使用的是中括号“[]”而创建元组使用小括号()
例:
number = (7,14,21,28,35,42) #数字类型 print(number) str = ("xiwen","zeno","xiaopeng") #字符串类型 print(str) untile = ("xiwen",28,("xiaopeng","hello"),["xiao","zekai"]) #混合类型 print(untile) verse = ("一片冰心在玉壶",) #此为一个字符串非元组,加一个逗号就变为元组 print(verse) print(type(verse))
执行结果:
(7, 14, 21, 28, 35, 42)
('xiwen', 'zeno', 'xiaopeng')
('xiwen', 28, ('xiaopeng', 'hello'), ['xiao', 'zekai'])
('一片冰心在玉壶',)
<class 'tuple'>
在python中,虽然元组是使用一对小括号将所有的元素括起来,但是实际上,小括号并不是必须的,只要将一组值使用逗号分隔开来,python就可以认为他们是元组
2、创建空元组
在python中,也可以创建空元组,例如,要创建一个名称为emptyuple的空元组,可以使用以下代码:
mptytuple = () #为函数返回一个元组类的值 print(emptytuple)
空元组可以应用在为函数传递一个空值或者返回空值时,例如定义一个函数必须传递一个元组类型的值,而我们还不想为他传递一组数据,那么就可以创建一个空元组传递给他。
3、创建数值元组
在python中,可以使用tuple()函数直接将range()函数循环出来的结果转换为数值元组。
tuple()函数语法如下:
tuple(data)
其中data表示可以转换为元组的数据,其类型可以时range对象、字符串、元组或者其他可迭代类型的数据。
例:
tuple1 = tuple (range(2,21,2),) print(tuple1)
执行结果:(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
说明:使用tuple()函数不仅能通过range对象创建元组,还可以通过其他对象创建元组。
4、删除元组
对于删除元组,不在使用时,可以使用del语句将其删除。语法格式如下:
del tuplename
其中,tuplename为要删除元组的名称。
del语句并不常用,因为python自带的垃圾回收机制
例:
tuple1 = tuple (range(2,21,2),) print(tuple1) del tuple1 #删除不存在的元组就会出现错误 print(tuple1)
二、访问元组元素
在python中,如果想将元组的内容输出的比较简单,可以直接使用print()函数。例如,想打印上面元组中的untile元组,即可使用下面代码:
untile = ("xiwen",28,("xiaopeng","hello"),["xiao","zekai"]) print(untile)
执行结果:('xiwen', 28, ('xiaopeng', 'hello'), ['xiao', 'zekai'])
从上面的执行结果来看,在输出元组时,是包括左右两侧的小括号。如果不想输出全部元素,也可以通过元组的索引获取指定元素。例如,要获取元组untile中元组索引为0的元素,可以使用下面代码:
print(untile[0])
执行结果:xiwen
从上面的执行结果中可以看出,在输出单个元组元素时,不包括小括号。如果是字符串,还不包括左右两边的引号。
另外,对于元组也可以采用切片的方式获取指定元素。例如,要访问上个元组的前三个元素,可以使用下面代码:
print(untile[:3])
执行结果:('xiwen', 28, ('xiaopeng', 'hello'))
同列表一样,元组也可以使用for循环进行遍历。下面通过一个具体的实例演示如何通过for循环遍历元组。
for item in untile: print(item)
执行代码:
xiwen
28
('xiaopeng', 'hello')
['xiao', 'zekai']
三、修改元组元素
定一个包含6个元素的元组,修改其中第5个元素的内容,代码如下:
coffeename = ("lanshan","kabuqiluo","mantening","shexiangmao","gelunbiya")
coffeename[4] = '拿铁'
print(coffeename)
执行结果会报错
元组不可变序列,所以我们不能对他单个元素的值进行修改。但是元组也不是完全不能修改,我们可以对元组进行重新赋值。例如,下面代码是允许的:
coffeename = ("lanshan","kabuqiluo","mantening","shexiangmao","gelunbiya") coffeename = ("lanshan","kabuqiluo","moka","shexiangmao","gelunbiya") print(coffeename)
执行结果:('lanshan', 'kabuqiluo', 'moka', 'shexiangmao', 'gelunbiya')
从上面代码可以看出,元组coffeename的值已经改变
另外,还可以对元组进行连接组合。
newcoffeename = ("weiyena","nini") allcoffeename = coffeename + newcoffeename print(allcoffeename) 执行结果:('lanshan', 'kabuqiluo', 'moka', 'shexiangmao', 'gelunbiya', 'weiyena', 'nini')
注意:在元组连接时,连接的元组必须都是元组。不能将元组和字符串或者列表进行连接。例如,下面代码是错误的:
newcoffeename = ("weiyena","nini")
allcoffeename = “ukguzheng”+ newcoffeename
在进行元组连接时,如果要连接的元组只有一个元素时,一定不要忘记后面的逗号。
四、元组推导式
使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,只是将列表推导式中的中括号[]修改为小括号()。例如我们可以使用下面的代码生成一个包含10个随机数元组
import random #导入random标准库 randomnumber = (random.randint(10,100) for i in range(10)) print(randomnumber)
执行结果:<generator object <genexpr> at 0x7fc5f81c29e0>
从上面的执行结果中可以看出,使用元组推导式生成的结果并不是一个元组或者列表,而是一个生成器对象,这一点和列表推导式不同。要使用该生成器对象可以将其转换为元组或者列表。其中,转换为元组使用tuple()函数,而转换为列表使用list()函数。
使用元组推导式生成10个随机数的生成队象,然后将其转换为元组输出,可以使用下面代码:
import random #导入random标准库 randomnumber = (random.randint(10,100) for i in range(10)) print(randomnumber) #生成一个生成器对象 print(tuple(randomnumber))
执行结果:(43, 87, 68, 100, 59, 84, 13, 80, 69, 21)
要使用通过元组推导器生成的生成器对象,还可以直接通过for循环遍历或者直接使用_next()_方法进行遍历;
说明:在python中next()用于遍历生成器对象
例如,通过生成器推导式生成一个包含3个元素的生成器对象number,然后调用3次_next()_方法输出每个元素,在生成器对象number转换为元组输出;
import random #导入random标准库 randomnumber = (random.randint(10,100) for i in range(10))print(randomnumber.__next__()) #输出第一个元素 print(randomnumber.__next__()) #输出第二个元素
执行结果:88
71
再例如,通过生成器推导式生成一个包括4个元素的生成器对象number,然后应用for循环遍历生成器对象,并输出每一个元素的值,最后再将其转换为元组输出,代码如下:
number = (i for i in range(4)) for i in number: print(i,end=" ") print(tuple(number))
执行结果:0 1 2 3 ()
从上面的两个实例中可以看出,无论通过那种方法遍历,如果还想再使用该生成器对象都必须重新创建一个生成器对象,因为遍历后原生成器对象已经不存在了。
五、元组与列表的区别
元组和列表都属于序列,他们都可以按照特定的序列存放一组元素,而且类型不受限制,只要python支持类型都可以。那么他们之间有什么区别?
简单理解:列表可以修改,
元组不能修改,可以从新创建
列表与元组的区别:
列表属于可变序列,它的元素可以随时修改和删除,而元组属于不可变序列,其中的元素不可以修改,除非整体替换。
列表可以使用append()、extend()、insert()、remove()和pop()等方法实现添加和修改列表元素,而元组没有这几种办法,因为不能向元组中添加和修改元素,同样,也不能删除元素。
列表可以使用切片访问和修改列表的元素。元组也支持切片,但是他只支持通过切片访问元组中的元素,不支持修改。
元组比列表的访问和处理速度快。所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组不使用列表。
列表不能作为字典的键,而元组可以