本章将讨论贯穿本书要使用的Python语言内建功能。由于像pandas和NumPy这类附加库提供了在大数据集上的高级计算功能,所以它们被设计为与Python内建数据操作工具协同使用。
3.1 数据结构和序列
Python的数据结构简单但强大。精通这些数据结构是成为优秀Python编程者的必要条件。
3.1.1 元组
元组是一种固定长度、不可变的Python对象序列。创建元组最简单的办法就是用逗号分隔序列值
>>> tup = 4, 5, 6
>>> tup
(4, 5, 6)
当你通过更复杂的表达式来定义元组时,通常需要用括号将值包起来,例如下面这个例子。生成了元素是元组的元组:
>>> nested_tup = (4, 5, 6), (7, 8)
>>> nested_tup
((4, 5, 6), (7, 8))
你可以使用tuple
函数将任意序列或迭代器转换为元组:
>>> tuple([4, 0, 2])
(4, 0, 2)
>>> tup = tuple('string')
>>> tup
('s', 't', 'r', 'i', 'n', 'g')
>>> tup[0]
's'
元组的元素可以通过中括号[]
来获取,在大多数序列类型中都可以使用这个方法。和C、C++、Java以及很多其他语言一样,Python中的序列索引是从0开始的。
虽然对象元组中存储的对象其自身是可变的,但是元组一旦被创建,各个位置上的对象是无法被修改的:
>>> tup = tuple(['foo', [1, 2], True])
>>> tup[2] = False
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
tup[2] = False
TypeError: 'tuple' object does not support item assignment
>>>
如果元组中的一个对象是可变的,例如列表,你可以在它内部进行修改:
>>> tup
('foo', [1, 2], True)
>>> tup[1].append(3)
>>> tup
('foo', [1, 2, 3], True)
可以使用+
号连接元组,来生成更长的元组:
>>> (4, None, 'foo') + (6, 0) + ('bar',)
(4, None, 'foo', 6, 0, 'bar')
将元组乘以整数,则会和列表一样, 生成含有多份拷贝的元组:
>>> ('foo', 'bar') * 4
('foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar')
请注意对象自身并没有复制,只是指向它们的引用进行了复制。如下例所示:
>>> # 对象自身没有复制,而是对“引用”进行了复制
>>> tup = ([1, 2], 'bar') * 4
>>> tup
([1, 2], 'bar', [1, 2], 'bar', [1, 2], 'bar', [1, 2], 'bar')
>>> tup[0].append(3)
>>> tup
([1, 2, 3], 'bar', [1, 2, 3], 'bar', [1, 2, 3], 'bar', [1, 2, 3], 'bar')
3.1.1.1 元组拆包
如果你想要将元组型的表达式赋值给变量,Python会对等号右边的值进行拆包:
>>> tup = (4, 5, 6)
>>> a, b, c = tup
>>> b
5
即使是嵌套元组也可以拆包:
>>> tup = 4, 5, (6, 7)
>>> a, b, (c, d) = tup
>>> d
7
使用这个功能,你可以轻松地交换变量名。在其它语言中,代码可能如下:
tmp = a; a = b; b = tmp;
但在Python中,交换可以如下完成:
>>> a, b = 1, 2
>>> a
1
>>> a, b = b, a
>>> a
2
拆包的一个常用场景就是遍历元组,或者是列表组成的序列:
>>> seq = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
>>> for a, b, c in seq:
print('a={0}, b={1}, c={2}'.format(a, b, c))
a=1, b=2, c=3
a=4, b=5, c=6
a=7, b=8, c=9
另一个常用的场景是从函数返回多个值。我将在后续内容详细介绍。
Python语言新增了一些更为高级的元组拆包功能,用于帮助你从元组的起始位置“采集”一些元素。这个功能使用特殊的语法*rest
,用于在函数调用时获取任意长度的位置参数列表:
>>> values = 1, 2, 3, 4, 5
>>> a, b, *rest = values
>>> a, b
(1, 2)
>>> rest
[3, 4, 5]
3.1.1.2 元组方法
由于元组的内容和长度是无法改变的,它的实例方法很少。一个常见的有用方法是count
(列表也可用),用于计量某个数值在元组中出现的次数:
>>> a = (1, 2, 2, 2, 3, 4, 2)
>>> a.count(2)
4