首页 > 代码库 > python基础教程_学习笔记:序列-1

python基础教程_学习笔记:序列-1

序列

数据结构:通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构。


python中,最基本的数据结构是序列

序列中的每个元素被分配一个序号——即元素的位置,也称为索引。第一个索引是0,第二个是1,以此类推。

序列概览

python包含6种内建的序列:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。

列表和元组的主要区别在于,列表可以修改,元组不能。

使用后者的理由通常是技术性的,它与python内部的运作方式有关。这也是内建函数可能返回元组的原因。

一般来说,在几乎所有的情况下,列表都可以代替元组。其中一种需要注意到例外情况:使用元组作为字典的键。在这种情况下,因为键不可修改,所以不能使用列表。

通用序列操作

所有序列类型都可以进行某些特定的操作。这些操作包括:索引、分片、加、乘以及检查某个元素是否属于序列的成员(成员资格)。除此之外,python还有计算序列长度、找出最大元素和最小元素的内建函数。

注:另外一个重要的操作:迭代,后续会接触到。

索引

序列中的所有元素都是编号的——从0开始递增。这些元素可以通过编号分别访问。使用负数索引时,python会从右边,也就是最后一个元素开始计数。最后1个元素的位置编号是-1(记住:不是0)

字符串

>>> greeting = ‘hello‘

>>> greeting[0]

‘h‘

>>> greeting[-1]

‘o‘

>>> greeting[1]

‘e‘

>>> greeting[-2]

‘l‘

字符串字面值也可以使用索引。

>>> ‘hello‘[-1]

‘o‘

>>> ‘hello‘[-2]

‘l‘

列表

>>>greeting=[‘hello‘,‘world‘,‘you‘,‘and‘,‘i‘]

>>> greeting[0]

‘hello‘

>>> greeting[-1]

‘i‘

元组

>>>greeting=(‘hello‘,‘world‘,‘you‘,‘i‘)

>>> greeting[0]

‘hello‘

>>> greeting[-2]

‘you‘

如果一个函数调用返回一个序列,可以直接对返回结果进行索引操作。

>>>forth_num=raw_input("Please input a num(lenght>4): ")[3]

Please input a num(lenght>4): 20140508

>>> forth_num

‘4‘

分片

使用分片操作可以访问一定范围内的元素,通过冒号相隔的两个索引来实现。

字符串

>>> greeting = ‘Hello,world!‘

>>> greeting[0:3]

‘Hel‘

列表

>>> greeting=[‘hello‘,‘world‘,‘you‘,‘and‘,‘i‘]

>>> greeting[1:3]

[‘world‘, ‘you‘]

元组

>>>greeting=(‘hello‘,‘world‘,‘you‘,‘i‘)

>>> greeting[0:3]

(‘hello‘, ‘world‘, ‘you‘)

 

可知,分片中第一个索引是需要提取部分的第一个元素的编号,第二个索引是分片之后剩下部分的第1个元素的编号。简言之,分片操作的实现需要提供两个索引作为边界,第一个索引是包含在分片内的,第2个则不包含在分片内。

优雅的捷径

如果需要访问序列的最后几个元素呢?当然可以显式的操作:

>>> greeting=[‘hello‘,‘world‘,‘you‘,‘and‘,‘i‘]

>>> greeting[1:5]

[‘world‘, ‘you‘, ‘and‘, ‘i‘]

索引5指向的元素并不存在,这种方法当然是可行的。但如果需要从列表的结尾开始计数呢?

>>> greeting[-4:-1]

[‘world‘, ‘you‘, ‘and‘]

>>> greeting[-4:0]

[]

这并不是我们想要的结果。

实际上,只要分片最左边的索引比右边的晚出现在序列中,结果就是一个空序列。可以使用捷径:如果分片所得部分包含序列结尾的元素,置空最后一个索引即可

>>> greeting[-4:]

[‘world‘, ‘you‘, ‘and‘, ‘i‘]

同样可以用于序列开始的元素:

>>> greeting[:3]

[‘hello‘, ‘world‘, ‘you‘]

同理,想要复制整个序列,可以将两个索引置空(冒号不能省略):

>>> greeting[:]

[‘hello‘, ‘world‘, ‘you‘, ‘and‘, ‘i‘]

更大的步长

进行分片,分片的开始和结束点需要进行指定,另外一个参数——步长——通常是隐式设置的。在普通的分片中,步长是1——分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素。

>>> numbers=[1,2,3,4,5,6,7,8,9,10]

>>> numbers[0:10:2]

[1, 3, 5, 7, 9]

捷径在这里依然适用。将每4个元素中的第一个提取出来:

>>> numbers[::4]

[1, 5, 9]

步长不能为0,因为无法向下进行:

>>> numbers[::0]

 

Traceback (most recent call last):

 File "<pyshell#49>", line 1, in <module>

   numbers[::0]

ValueError: slice step cannot be zero

 

步长可以是负数,即从右到左提取元素:

>>> numbers[8:3:-1]

[9, 8, 7, 6, 5]

>>> numbers[::-2]

[10, 8, 6, 4, 2]

>>> numbers[:5:-2]

[10, 8]

>>> numbers[5::-2]

[6, 4, 2]

>>> numbers[3:8:-1]

[]

记住:分片最左边的索引比右边的晚出现在序列中,结果就是一个空序列。

当使用一个负数作为步长时,必须让开始点大于结束点。在没有明确指定开始点和结束点的时候,正负数的使用可能会带来一些混淆。

总之,对于一个正数步长,python会从序列的头部开始向右提前元素,直至最后一个元素;

对于负数步长,从序列的尾部开始向左提取元素,直到第一个元素。