序列概览
Python包含6种内置的序列:列表、元组、字符串 、Unicode字符串、buffer对象、xrange对象。在序列中的每个元素都有自己的编号。列表与元组的区别在于,列表是可以修改,而组元不可修改。理论上几乎所有情况下元组都可以用列表来代替。有个例外是但元组作为字典的键时,在这种情况下,因为键不可修改,所以就不能使用列表。
我们先来编写一个列表:
使用方括号括起来,列表元素使用逗号进行分隔:
代码语言:javascript复制>>> a = ["hello",100]
>>> a
['hello', 100]
>>>
序列是可以嵌套的:
代码语言:javascript复制>>> A =["xiaoming",98]
>>> B =["xiaohong",87]
>>> grade=[A,B]
>>> grade
[['xiaoming', 98], ['xiaohong', 87]]
>>>
下面来介绍一下通用的序列操作。
通用序列操作
所有序列都可以进行如下操作:
- 索引
- 分片
- 加
- 乘
- 检查某个元素是否属于序列成员(成员资格)
并且python提供了一些序列内置函数:
- 计算序列长度
- 找出做大元素及做小元素
另外序列操作还有迭代,这个以后介绍。 下面就这些操作做一个介绍
索引
序列的索引
索引即标号,及元素在序列中的编号。这些编号从0开始递增,0表示第一个元素:
代码语言:javascript复制>>> world = "Hello Word"
>>> world[0]
'H'
>>> world[3] #第四个元素
'l'
>>>
用法就如C语言的数组一样。在python中比较神奇的是,索引可以是负数:使用负数时,Python会从右边向左边计数,最后一个元素的索引值为-1,为啥不是-0呢?因为会和第一个元素重合:
代码语言:javascript复制>>> world = "Hello Word"
>>> world[0]
'H'
>>> world[3]
'l'
>>> world[-1]#从右边开始计数
'd'
>>> world[-2]
'r'
>>>
字符串字面值的索引
字符串字面值可以直接使用索引,不需要定义一个变量来引用这个字符串字面值,这和C语言不一样:
代码语言:javascript复制>>> "Hello Word"[1]
'e'
>>>
在函数返回值使用索引
有一些函数的返回值为字符串,有的返回其他的序列,我们可以在函数调用之后使用[]来对返回序列的元素值进行索引。
代码语言:javascript复制>>> input("input something:")[1]
input something:Hello word
'e'
>>>
示例小程序
在这个例子中我们使用序列来存储12个月份的单词字符串与每月天数的数字后缀。程序的目的是输入年月日后进行序列索引查找对应的单词并输出结果:
代码语言:javascript复制>>>
Year:2015
Month:9
Day:4
4th September 2015
>>>
程序清单1
代码语言:javascript复制months =[
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'Octber',
'November',
'December',
]
endings=['st','nd','rd'] 17*['th']
['st','nd','rd'] 7*['th']
['st']
year = input('Year:')
month = input('Month:')
day = input('Day:')
print(day endings[int(day)-1] ' ' months[int(month)-1] ' ' year)
注意点:
- 在序列前乘以一个数字x,表示重复序列元素x次并存入序列中:
>>> a = 5*['a','b']
>>> a
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
>>>
分片
分片即提取一个范围内的序列,语法是:
代码语言:javascript复制序列名(或字符串字面值)[a:b] 提取索引a~b范围内的子序列。
>>> number=[1,2,3,4,5,6,7,8,9,10]
>>> number[1:5]
[2, 3, 4, 5]
>>>
注意点:
- 范围采用左闭右开,即第一个索引元素包含在分片内,第二个则不包含在分片内。就像C 容器采取的迭代器策略一样。
- 右索引超出范围时,分片直接取到序列最后一个元素:
>>> number[0:19]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>
- 左索引比右索引的元素在序列中出现得晚时,分片为空序列:
>>> number[-3:1]
[]
>>>
- 忽略右索引,分片将直接取到最后一个索引:
>>> number[0:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>
- 同样的,忽略左索引时:
>>> number[:10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>
- 自然的,同时忽略两个索引,整个序列都成为分片了:
>>> number[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>
分片的步长
分片的步长指的是,在分片索引标记的范围内,多长的距离取样一个值构成分配。在上面展示的代码中,步长都是为1的,也即范围内所有元素都被取样。我们可以设置分片步长:
number[a