“谁愿为首,就必作你们的仆人。正如人子来,不是要受人的服事,乃是要服事人,并且要舍命,作多人的赎价。”(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                                   #不能原地修改,近str
Traceback (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 必须是不可变的。元组本身是不可改变的,列表是可变的。
  • 元组可以用在字符串格式化中。

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


总目录   |   上节:回顾list和str   |   下节:字典(1)

如果你认为有必要打赏我,请通过支付宝:[email protected],不胜感激。

results matching ""

    No results matching ""