元组( Tuple )是 Python 内置对象(类型),跟列表很相似,从外表看它们的差别就在于 [ ] 和 ()——列表是用方括号包裹,元组是用圆括号包裹——里面的成员要求完全一样,可以是任何 Python 对象,包括各种内置对象和自定义对象。
>>> t = (1, "a", [1,2])
>>> type(t)
<class 'tuple'>
这样就创建了一个元组对象,依照惯例,Python 中也会有同名的内置函数 tuple() ,通过它也可以得到元组类型的对象。
>>> t2 = tuple()
>>> t2
()
>>> type(t2)
<class 'tuple'>
>>> t3 = tuple([1, 2, 3])
>>> t3
(1, 2, 3)
>>> t4 = tuple('book')
>>> t4
('b', 'o', 'o', 'k')
从外形上看,除了 () 符号与列表的不同,其它与列表一样,但是,如果定义的元组中只有一个成员的话,需要特别注意。
>>> one = (1,) # (11)
>>> type(one)
<class 'tuple'>
>>> one2 = (1) # (12)
>>> type(one2)
<class 'int'>
认真观察注释(11)和(12)的差别,都使用了 () ,注释(11)比(12)在 1 后面多了有一个“ , ”符号,结果 one 引用了元组,one2 引用了整数。这个细节可能是以后开发中产生 BUG 的原因。
元组和列表、字符串一样,同属于序列,因此它具有序列的所有特点:“基本操作”、“索引”、“切片”——详见4.2.3、4.2.4、4.2.5节。下面简要演示,更多操作练习,请读者仿照4.2节有关内容自行实施。
# 基本操作
>>> t1 = (1, 2, 3)
>>> t2 = ('a', 'b', 'c')
>>> t1 + t2
(1, 2, 3, 'a', 'b', 'c')
>>> t1 * 2
(1, 2, 3, 1, 2, 3)
>>> len(t1)
3
>>> 1 in t1
True
# 索引和切片
>>> t2[1]
'b'
>>> t2[1:]
('b', 'c')
>>> t2[::-1]
('c', 'b', 'a')
元组和列表,除了形式上的差异,在内涵上也有不同。
>>> t = (3.14, 'book', 'python')
>>> t[0] = 'laoqi'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
这就显示了元组和列表的最大差别。列表可以通过索引修改某个成员,但是元组不能如此操作,这说明元组是不可修改的——是不可变对象,这个特点很类似于字符串。
如果非要修改元组中的成员,可以用 list() 函数将元组转换为列表:
>>> tlst = list(t)
>>> tlst
[3.14, 'book', 'python']
>>> tlst[0] = 'laoqi'
>>> tlst
['laoqi', 'book', 'python']
>>> t2 = tuple(tlst)
>>> t2
('laoqi', 'book', 'python')
按照对列表和字符串两个对象的学习经验,也应该了解一下元组的属性和方法了:
>>> dir(tuple)
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
略去双下滑开始和结尾的特殊属性和特殊方法,仅有 count() 和 index() 两个方法,其原因就在于元组是不可变对象,列表中那些能够对列表进行修改的方法在此处都不适用。
至此,我们对元组有了初步了解,读者可能很怀疑元组这种对象存在必要性——它类似列表,还不能修改,为什么还要用它呢?Python 不会做“无用功”,一般认为元组有如下使用情景:
所以,元组自有其用武之地,既然已经存在于Python中,必然是合乎理性的——“What is rational is real; And what is real is rational.”(黑格尔《Elements of the Philosophy of Right》)。
★自学建议 有一个读者向我反馈,她已经在财会岗位上工作了十多年了,因为孩子要学习编程,于是乎母子一起学习,相互启发,坚持了一年多,不仅孩子入门编程了,自己还将所学到的技能运用到了本职工作中,提高了工作效率。 这则事例启示我们,如果感到自学枯燥无味,可以“结对学习”(在软件开发中,有“结对编程”的开发方法),若再能学以致用,学习的目标明确、动力强大——不要把焦点放在“有个孩子”上。 ”