1. 索引(index)
python 中常用的序列有列表(list),元组(tuple)与字符串。对于 python 中的序列,可以使用索引来访问其成员,得到的结果是单个元素。其形式为 seq[index] 。另外 python 中的索引可以使用负整数来表示,最后一个元素使用负索引为 -1,向前依次递减。
>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0]
1
>>>l[1]
4
>>>l[-1]
9
>>>l[-2]
6
2. 分片(slice)
python 中序列的分片可用于访问一批序列元素,得到的结果是个序列。其形式为 seq[start:[end[:step]]] 。这个写法模仿自 python 方法声明中的非必须参数,在这里意指 end 与 step 根据语法可有可无。这样算来分片的形式就多得多了,根据分片中参数的个数,可知总的分片情况共有3种可能。
- 1). seq[start:] : 这种形式下分片所得结果为从 start 开始直到序列尾部的所有元素。
>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0:]
[1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[-1:]
[9]
- 2). seq[start:end]:这种形式下分片所得结果为从 start 开始直到 end (不包括 end) 的所有元素( end 超出序列最大索引时以最大索引计)。这种形式下存在三种可能,分别是 start < end,start = end 以及 start > end。
>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0:2] # start < end
[1, 4]
>>>l[0:0] # start = end
[]
>>>l[2:0] # start > end
[]
上面的第二、三种情况的结果倒也好理解,第二种情况是要取从索引 0 开始,而又不包括索引 0 的所有元素,明显是取不到,所以结果为空。第三种情况就更好说了从索引 2 处开始,向后直到索引 0 处结束的所有元素,结果自然也是空。这两种情况取不到元素,貌似用不到。其实不然,这两种情形有个很有意思的用处。
>>>l = [2, 5, 8]
>>>l[0:0] = [1, 4, 7]
>>>l
[1, 4, 7, 2, 5, 8]
>>>l[6:0] = [3, 6, 9]
>>>l
[1, 4, 7, 2, 5, 8, 3, 6, 9]
其实这也就是说在分片中仅有 start 和 end 且 start <= end 的情况下,可以使用这种分片形式在原序列中从索引位置为 start 处开始插入一个新的序列中的所有元素。举个例子来说, list 中的 extend 方法可以在列表尾部直接插入一个序列中的所有元素。假如需要在在头部也实现这样的方法,则可以定义 extendleft 如下:
>>>def extendleft(seq, new_seq):
... seq[0:0] = new_seq
...
>>>l = [2, 5, 8]
>>>l.extend([3, 6, 9])
>>>l
[2, 5, 8, 3, 6, 9]
>>>extendleft(l, [1, 4, 7])
>>>l
[1, 4, 7, 2, 5, 8, 3, 6, 9]
- 3). seq[start:end:step]:这种形式与上面的不同之处就在于多了个表示步长的 step 参数。这个 step 可为正或负,不可为零。为正时表示向后取元素时每隔 step 位取上一个,为负时则表示向前取元素时每隔 step 位取上一个。
>>>l=[1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0:8:2]
[1, 7, 5, 3]
>>>l[0:8:-2]
[]
>>>l[8:0:-2]
[9, 3, 5, 7]
>>>l[8:0:2]
[]
这种情况下, step 的正负性决定是向前还是向后取元素,step 的绝对值大小决定了每隔几位取一个序列成员(step 为1表示下一个元素,2表示下下一个元素,依次类推)。
3. slice (Python class, in 2. Built-in Functions)
python 中内置了 slice 类,它用于创建分片对象供序列使用。也就是说通过分片访问序列元素,可以使用 seq[s](s是一个slice对象)。
slice 类有两种可用形式,分别为 class slice(stop)
与 class slice(start, stop[, step])
。
>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>s = slice(3)
>>>s
slice(None, 3, None)
>>>l[s]
[1, 4, 7]
>>>s = slice(0, 8, 2)
>>>l[s]
[1, 7, 5, 3]
>>>l[0:8:2]
[1, 7, 5, 3]