1.9 元组
1.9.1 定义
先看一个例子:
- >>> #变量引用str
- >>> s = "abc"
- >>> s
- 'abc'
- >>>#如果这样写,就会是...
- >>> t = 123, 'abc', ["come","here"]
- >>> t
- (123, 'abc', ['come', 'here'])
上面例子中并没有报错,也没有“最后一个有效”,而是将对象作为一个新类型:tuple(元组),赋值给了变量t。
元组是用圆括号括起来的,元素之间用逗号隔开。(特别提醒,不管是圆括号还是逗号,都是英文半角的。这个并非杞人忧天,不知道什么原因,很多敲代码的朋友居然把自己的电脑默认输入方式为中文,结果常常在代码中插入全角符号。)
元素中的元素可以是任何Python对象类型。
其实,你不应该对元组陌生,前面讲述字符串的格式化输出时,有这样一种方式:
- >>> print "I love %s, and I am a %s" % ('python', 'programmer')
- I love python, and I am a programmer
这里的圆括号就是一个元组。
元组也是一种序列,这一点与列表、字符串类似。它的特点就是其中的元素不能更改,这一点与列表不同,倒是跟字符串类似;它的元素又可以是任何类型的数据,这一点与列表相同,但不同于字符串。
- >>> 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'
从上面的简单比较似乎可以认为,元组就是一个融合了部分列表和部分字符串属性的杂交产物。
1.9.2 索引和切片
前面有了关于列表和字符串的知识基础,它们都是序列类型,元组也是。因此,元组的基本操作和它们是一样的。
例如:
- >>> 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'))
1.9.3 用途
既然元组是列表和字符串的杂合,那么它有什么用途呢?不是用列表和字符串就可以了吗?
有些情况只需要列表和字符串,但是,世界是复杂的,我们要解决的问题不全是简单问题,就如同自然语言一样,虽然有的词汇看似可有可无,用别的也能替换之,但我们依然要在某些情况下使用它们。
一般认为元组有这些特点,并且也是它使用的情景:
- 元组比列表操作速度快。如果定义了一个值的常量集,并且唯一要用它做的是不断地遍历(遍历是一种操作,读者可以看后面的for循环)它,请使用元组代替列表。
- 如果对不需要修改的数据进行“写保护”,可以使代码更安全,这时使用元组而不是列表。如果必须要改变这些值,则需要执行元组到列表的转换。
- 元组可以在字典(另外一种对象类型,请参考后面的内容)中被用作key,但是列表不行。因为字典的key必须是不可变的,元组本身是不可改变的。
- 元组可以用在字符串格式化中。