当前位置: 首页 > 文档资料 > 跟老齐学 Python >

元组

优质
小牛编辑
144浏览
2023-12-01

“谁愿为首,就必作你们的仆人。正如人子来,不是要受人的服事,乃是要服事人,并且要舍命,作多人的赎价。”(MATTHEW 20:27-28)

元组

元组是Python中的一种对象类型。它与之前的列表、字符串、整数、浮点数等并列。

但,因为它跟列表接近,经常被忽略。

定义

先看一个例子:

>>> s = "abc">>> s'abc'

这是一个简单的赋值,还可以这样写,这就是Python的与众不同之处。

>>> t = 123, 'abc', ["come","here"]>>> t(123, 'abc', ['come', 'here'])

不仅没有报错,也没有“最后一个有效”,而是将对象放到了一个圆括号里面。

这个带有圆括号的对象,就是一种新的对象(或数据)类型:tuple(元组)。

>>> type(t)<class 'tuple'>        #这是Python 3的结果,在Python 2中显示:<type 'tuple'>

元组是用圆括号括起来的,其中的元素之间用逗号隔开。(都是英文半角)

元组中的元素类型是任意的Python对象(数据)。

这种类型,可以歪着想,所谓“元”组,就是用“圆”括号啦。

仅从前面那个例子,显而易见得出,元组是序列,这点上跟列表和字符串类似。

但元组中的元素不能更改,这点上跟列表不同,倒是跟str类似;它的元素又可以是任何类型的数据,这点上跟列表相同,但不同于字符串。

>>> t = 1,"23",[123,"abc"],("python","learn")   #元素多样性,近list>>> t(1, '23', [123, 'abc'], ('python', 'learn'))>>> t[0] = 8                                   #不能原地修改,近strTraceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>> t.append("no")  Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: 'tuple' object has no attribute 'append'

从上面的简单比较似乎可以认为,元组就是一个融合了部分列表和部分字符串属性的杂交产物。此言有理。

索引和切片

元组是序列,因此,元组的基本操作就和列表和字符串相仿。

例如:

>>> t = (1, '23', [123, 'abc'], ('python', 'learn'))>>> t[2][123, 'abc']>>> t[1:]('23', [123, 'abc'], ('python', 'learn'))>>> t[2][0]     #还能这样呀,哦对了,list中也能这样123>>> t[3][1]'learn'

关于序列的基本操作在元组上的表现,就不一一展示了。读者可以去试试。

但是这里要特别提醒,如果一个元组中只有一个元素的时候,应该在该元素后面加一个半角的英文逗号。

>>> a = (3)>>> type(a)<type 'int'>>>> b = (3,)>>> type(b)<type 'tuple'>

以上面的例子说明,如果不加那个逗号,就不是元组,加了才是。这也是为了避免让Python误解你要表达的内容。

所有在列表中可以修改列表的方法,在元组中,都失效。因为元组不可修改。

分别用list()tuple()能够实现两者的转化:

>>> t = (1, '23', [123, 'abc'], ('python', 'learn'))>>> tls = list(t)                           #tuple-->list>>> tls[1, '23', [123, 'abc'], ('python', 'learn')]>>> t_tuple = tuple(tls)                    #list-->tuple>>> t_tuple(1, '23', [123, 'abc'], ('python', 'learn'))

元组用在哪里?

既然它是列表和字符串的杂合,它有什么用途呢?不是用列表和字符串都可以了吗?

在很多时候,的确是用列表和字符串都可以了。但是,不要忘记,我们用计算机语言解决的问题不都是简单问题,就如同我们的自然语言一样,虽然有的词汇看似可有可无,用别的也能替换之,但是我们依然需要在某些情况下使用它们.

一般认为,元组有这类特点,并且是它使用的情景:

  • 元组比列表操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用元组代替列表。
  • 如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用元组而不是列表如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行元组到列表的转换 (需要使用一个特殊的函数)。
  • 元组可以在字典(又一种对象类型,后面要讲述) 中被用做 key,但是列表不行。字典的key 必须是不可变的。元组本身是不可改变的,列表是可变的。
  • 元组可以用在字符串格式化中。

元组很简单,不用过多的篇幅说明,但是,依然建议读者把它作为序列,依次按照序列的操作对元组进行实践。