1.9 元组

1.9.1 定义

先看一个例子:

  1. >>> #变量引用str
  2. >>> s = "abc"
  3. >>> s
  4. 'abc'
  5.  
  6. >>>#如果这样写,就会是...
  7. >>> t = 123, 'abc', ["come","here"]
  8. >>> t
  9. (123, 'abc', ['come', 'here'])

上面例子中并没有报错,也没有“最后一个有效”,而是将对象作为一个新类型:tuple(元组),赋值给了变量t。

元组是用圆括号括起来的,元素之间用逗号隔开。(特别提醒,不管是圆括号还是逗号,都是英文半角的。这个并非杞人忧天,不知道什么原因,很多敲代码的朋友居然把自己的电脑默认输入方式为中文,结果常常在代码中插入全角符号。)

元素中的元素可以是任何Python对象类型。

其实,你不应该对元组陌生,前面讲述字符串的格式化输出时,有这样一种方式:

  1. >>> print "I love %s, and I am a %s" % ('python', 'programmer')
  2. I love python, and I am a programmer

这里的圆括号就是一个元组。

元组也是一种序列,这一点与列表、字符串类似。它的特点就是其中的元素不能更改,这一点与列表不同,倒是跟字符串类似;它的元素又可以是任何类型的数据,这一点与列表相同,但不同于字符串。

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

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

1.9.2 索引和切片

前面有了关于列表和字符串的知识基础,它们都是序列类型,元组也是。因此,元组的基本操作和它们是一样的。

例如:

  1. >>> t
  2. (1, '23', [123, 'abc'], ('python', 'learn'))
  3. >>> t[2]
  4. [123, 'abc']
  5. >>> t[1:]
  6. ('23', [123, 'abc'], ('python', 'learn'))
  7.  
  8. >>> t[2][0] #还能这样呀,哦,对了,list中也能这样
  9. 123
  10. >>> t[3][1]
  11. 'learn'

关于序列的基本操作在元组上的表现就不一一展示了,读者自行调试吧。

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

  1. >>> a = (3)
  2. >>> type(a)
  3. <type 'int'>
  4.  
  5. >>> b = (3,)
  6. >>> type(b)
  7. <type 'tuple'>

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

列表和元组之间可以实现转化,分别使用list()和tuple()实现。

  1. >>> t
  2. (1, '23', [123, 'abc'], ('python', 'learn'))
  3. >>> tls = list(t) #tuple-->list
  4. >>> tls
  5. [1, '23', [123, 'abc'], ('python', 'learn')]
  6.  
  7. >>> t_tuple = tuple(tls) #list-->tuple
  8. >>> t_tuple
  9. (1, '23', [123, 'abc'], ('python', 'learn'))

1.9.3 用途

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

有些情况只需要列表和字符串,但是,世界是复杂的,我们要解决的问题不全是简单问题,就如同自然语言一样,虽然有的词汇看似可有可无,用别的也能替换之,但我们依然要在某些情况下使用它们。

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

  • 元组比列表操作速度快。如果定义了一个值的常量集,并且唯一要用它做的是不断地遍历(遍历是一种操作,读者可以看后面的for循环)它,请使用元组代替列表。
  • 如果对不需要修改的数据进行“写保护”,可以使代码更安全,这时使用元组而不是列表。如果必须要改变这些值,则需要执行元组到列表的转换。
  • 元组可以在字典(另外一种对象类型,请参考后面的内容)中被用作key,但是列表不行。因为字典的key必须是不可变的,元组本身是不可改变的。
  • 元组可以用在字符串格式化中。