第11课:元组

元组(tuple)是python中另一个重要的序列结构,与列表类似,也由一系列按特定顺序排列的元素组成,但是它是不可变序列。因此,元组也可以称为不可变的列表。在形式上,元组的所有元素都放在一堆“()”中,两个相邻元素间使用逗号“,”分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到元组中,并且在同一个元组中,元素的类型可以不同,因为它们之间没有任何关系。通常情况下,元组用于保存程序中不可修改的内容。

说明:从元组和列表的定义上看,这两种结构比较相似,那么它们之间有哪些区别呢。它们之间的主要区别就是元组是不可变序列,列表是可变序列。即元组中的元素不可以单独修改,而列表则可以任意修改。

1.元组的创建和删除

在python中提供了多种创建元组的方法,下面分别进行介绍。

1.使用赋值运算符直接创建元组

同其他类型的python变量一样,创建元组时,也可以使用赋值运算符“=”直接将一个元组赋值给变量,语法格式如下:

  • tuplename = (element 1,element 2,element 3,…………..,element n)

其中tuplename表示元组的名称,可以是任何符合python命名规则的标识符;
element 1、element 2、element 3、element n表示元组中的元素,个数没有限制,并且只有是python支持的数据类型就可以。

注意:创建元组的语法与创建列表的语法类似,只是创建列表时使用的是“[]”,而创建元组时使用的是“()”。

例如,下面定义的元组都是合法的:

在python中,虽然元组是使用一对小括号将所有的元素括起来,但是实际上,小括号并不是必须的,只要将一组值用逗号分隔开来,python就可以认为它是元组。例如下面的代码:

  • src = “支付宝”,”腾讯”,”网易”,”金山云”,”陌陌”

在IDLE中输出该元组后,结果如下:

如果要创建的元组只包括一个元素,则需要在定义元组时,在元素的后面加一个“,”。例如,下面的代码定义就是包括一个元素的元组:

而下面的代码,则表示定义一个字符串:

说明:在python中,可以使用type()函数测试变量的类型,代码如下:

2.创建空元组

在python中,也可以创建空元组,例如,要创建一个 名称为src的空元组,代码如下:

  • src = ()

空元组可以应用在函数传递一个空值或者返回空值时。例如,定义一个函数必须传递一个元组类型的值,而我们还不想为它传递一组数据,那么就可以创建一个空元组传递给它。

3.创建数值元组

在python中,可以使用tuple()函数直接将range()函数循环出来的结果转换为数值元组。tuple()函数的语法格式如下:

  • tuple(data)

其中data表示可以转换为元组的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。

例如创建一个10-20之间(不包括20)所有偶数的元组,可以使用下面的代码:

  • tuple(range(10,20,2))

运行上面的代码后,结果如下:

说明:使用tuple()函数不仅能通过range对象创建元组,还可以通过其他对象创建元组。

4.删除元组

对于已经创建的元组,不在使用时,可以使用del语句将其删除,语法格式如下:

  • del tuplename

其中tuplename为要删除元组的名称。

说明:del语句在实际开发时,并不常用。因为python自带的垃圾回收机制会自动销毁不用的元组,所以即使我们不手动将其删除,python也会自动将其回收。

例如,定义一个名称为src的元组,保存几个常见的厂商,应用del语句将其删除。代码如下:

访问元组元素

在python中,如果想将元组的内容输出也比较简单,可以直接使用print()函数即可。例如,定义一个名称为name的元组,想要打印该元组可以使用下面的代码:

  • name = (‘阿里巴巴’,’腾讯’,28,(“联想”,”阿里云”),[“爬虫”,”云 计算”,”web开发”])
  • print(name)

执行结果如下:

从上面的执行结果中可以看出,在输出元组时,是包括左右两侧的小括号的。如果不想要输出全部的元素,也可以通过元组的索引获取指定的元素。例如,要获取元组name中索引为0的元素,代码如下:

  • print(name[0])

执行结果如下:

从上面的执行结果中可以看出,在输出单个元组元素时,不包括小括号,如果是字符串,还不包括左右的引号。

另外,对于元组也可以采用切片方式获取指定的元素。例如,要访问元组name中前3个元素,可以使用下面的代码:

  • print(name[:3])

执行结果如下:

同列表一样,元组也可以使用for循环进行遍历。

修改元组元素

元组是不可变序列,所以不能对它的单个元素值进行修改。但是元组也不是完全不能修改。我们可以对元组进行从新赋值。例如,下面的代码是允许的:

执行结果如下:

从上面的执行结果可以看出,元组name的值已经改变。

另外,还可以对元组进行连接组合。例如,可以使用下面的代码实现在已经存在的元组结尾处添加一个新元组。

执行结果如下:

  • 原元组: (‘阿里巴巴’, ‘腾讯’, 28, (‘联想’, ‘阿里云’))
  • 组合后: (‘阿里巴巴’, ‘腾讯’, 28, (‘联想’, ‘阿里云’), ‘爬虫’, ‘云 计算’, ‘web开发’)

注意:在进行元组连接时,连接的内容必须都是元组。不能将元组和字符串或者列表进行连接。例如,下面的代码就是错误的:

  • name = (‘阿里巴巴’,’腾讯’,28,(“联想”,”阿里云”))
  • name1 = name + [‘爬虫’,’云 计算’]

常见错误:在进行元组连接时,如果要连接的元组只有一个元素时,一定不要忘记后面的逗号。例如使用下面的代码,将产生如下图的错误:

  • name = (‘阿里巴巴’,’腾讯’,28,(“联想”,”阿里云”))
  • name1 = name + (’爬虫’)

元组推导式

使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,只是将列表推导式中的“[]”修改为小括号“()”。例如,我们生成一个包含10个随机数的元组,代码如下:

执行结果如下:

从上面的执行结果中,可以看出使用元组推导式生成的结果并不是一个元组或者列表,而是一个生成器对象,这一点和列表推导式是不同的,需要使用该生成器对象可以将其转换为元组或者列表。其中,转换为元组需要使用tuple()函数,而转换为列表则需要使用list()函数。

我们接着对上面的代码进行修改,将其转换为元组并输出,代码如下:

执行结果如下:

要使用通过元组推导器生成的生成器对象,还可以直接通过for循环遍历或者直接使用_next_()方法进行遍历。

说明:在python2.x中,_next_()方法对应的方法为next()方法,也是用于遍历生成器对象的。

例如,通过生成器推导式生成一个包含3个元素的生成器对象number,然后调用3次_next_()方法输出每个元素,再将生成器对象number转换为元组输出,代码如下:

执行结果如下:

再如,通过生成器推导式生成一个包括4个元素的生成器对象number,然后应用for循环遍历该生成器对象,并输出每一个元素的值,最后在将其转换为元组输出,代码如下:

执行结果如下:

从上面的两个示例中可以看出,无论通过哪种方法遍历后,如果在想使用该生成器对象,都必须从新创建一个生成器对象,因为遍历后原生成器对象已经不存在了。

元组与列表的区别

元组和列表都属于序列,而且它们又都可以按照特定顺序存放一组元素,类型又不受限制,只要是python支持的类型都可以。那么它们之间有什么区别呢?

列表类似于我们用铅笔在纸上写下自己喜欢的歌词,写错了还可以擦掉;而元组则类似于用钢笔写下的歌词,写上了就擦不掉了,除非换一张纸重写。

列表和元组的区别主要体现在以下几个方面。

  • 列表属于可变序列,它的元素可以随时修改或者删除;而元组属于不可变序列,其中的元素不可以修改,除非整体替换。
  • 列表可以使用append()、extend()、insert()、remove()、和pop()等方法实现添加和修改列表元素;而元组则没有这几个方法,因为不能向元组中添加和修改元素,同样也不能删除元素。
  • 列表可以使用切片访问和修改列表中的元素;元组也支持切片,但是它只支持通过切片访问元组中的元组,不支持修改。
  • 元组比列表的访问和处理速度快。所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组。
  • 列表不能作为字典的键,而元组则可以。