元组
“谁愿为首,就必作你们的仆人。正如人子来,不是要受人的服事,乃是要服事人,并且要舍命,作多人的赎价。”(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 必须是不可变的。元组本身是不可改变的,列表是可变的。
- 元组可以用在字符串格式化中。
元组很简单,不用过多的篇幅说明,但是,依然建议读者把它作为序列,依次按照序列的操作对元组进行实践。