目录

一、高级特性
掌握了 Python 的数据类型、语句和函数,基本上就可以编写出很多有用的程序了。
比如构造一个 1, 3, 5, 7, ..., 99
的列表,可以通过循环实现:
L = []
n = 1
while n <= 99:
L.append(n)
n = n + 2
取 list 的前一半元素,也可以通过循环实现。但是在 Python 中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
基于这一思想,我们来介绍 Python 中非常有用的高级特性,1行代码能实现的功能,绝不写 5 行代码。请始终牢记,代码越少,开发效率越高。
1.1 切片
取一个 list 或 tuple 的部分元素是非常常见的操作。比如,一个 list 如下:
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
取前 3 个元素,应该怎么做?按照我们已经掌握的做法可以这样实现:
>>> [L[0], L[1], L[2]]
['Michael', 'Sarah', 'Tracy']
如果要取前 N 个元素,我们可以用循环,也就是索引为 0~(N-1) 的元素:
>>> r = []
>>> n = 3
>>> for i in range(n):
... r.append(L[i])
...
>>> r
['Michael', 'Sarah', 'Tracy']
对这种经常取指定索引范围的操作,用循环十分繁琐。前面我们在 “字符串” 的数据类型中讲过一种 切片(Slice)
操作,它不仅可以用于字符串,也可以用于 list 类型,能大大简化操作步骤。我们来回顾一下:
切片(slice)
:语法为 [ 起始 : 结束 : 步长],选取的区间为 “左闭右开”。“起始” 为空,则默认从头开始;“结束” 为空,则默认一直到结尾;步长为空,则默认为1。
对应上面的问题,取前 3 个元素,用一行代码就可以完成切片:
>>> L[0:3] # 这里省略了步长,默认为1
['Michael', 'Sarah', 'Tracy']
L[0:3]
表示,从索引0
开始取,知道索引3
为止,但不包括索引3
。即索引 0、1、2,刚好前 3 个元素。
如果切片的起始索引是 0
,还可以省略:
>>> L[:3] # 起始索引默认为0
['Michael', 'Sarah', 'Tracy']
也可以从索引 1 开始,取出 2 个元素出来:
>>> L[1:3]
['Sarah', 'Tracy']
类似的,既然 Python 支持 L[-1]
取倒数第一个元素,那么它同样支持倒数切片,如下所示:
>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']
记住:倒数第一个元素的索引是
-1
。
切片操作十分有用。我们先创建一个 0~99 的数组:
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]
可以通过切片轻松取出某一段数列,比如前 10 个数:
>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
后 10 个数:
>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
取前 11~20 个数:
>>> L[10:20]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
前10个数,每两个取一个:
>>> L[:10:2]
[0, 2, 4, 6, 8]
所有数,每5个取一个:
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
甚至什么都不写,只写 [:]
就可以原样复制一个 list:
>>> L[:]
[0, 1, 2, 3, ..., 99]
由于 tuple 也是一种 list,唯一区别是 tuple 不可变。因此,tuple 也可以用取片操作,只是操作的结果仍是 tuple:
>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)
其实字符串也可以看成是一种 list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'
在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。
1.2 迭代
如果给定一个 list 或 tuple,我们可以通过 for
循环来便利这个 list 或 tuple,这种遍历我们称为 迭代(Iteration)
。
在 Python 中,迭代是通过 for ... in
来完成的,而很多语言比如 C语言,迭代 list 是通过下标完成的,如下所示:
for (i = 0; i < length; i++) {
n = list[i];
}
可以看出,Python 的 for
循环抽象程度要高于 C语言。因为 Python 的 for
循环不仅可以用在 list 或 tuple 上,还可以作用在其他可迭代对象上。
list 这种数据类型虽然有下标,但是很多其他数据类型是没有下标的。但是只要是可迭代对象,无论有无下标,都可以迭代,比如 dict 就可以迭代,如下所示:
>>> d = {
'a': 1, 'b': 2