Python学习笔记 – 序列(一)序列类型
标签(空格分隔): python 序列
序列
python中最基本的数据结构就是序列(sequence),sequence(序列)是一组有顺序的元素的集合。
python中的序列类型,有着相同的访问模式:它的每个元素可以通过指定的偏移量(索引)来获得。而多个元素可以通过切片的操作来获得。
Python中的序列有:
- 字符串(string)
- Unicode字符串
- 列表(list)
- 元组(tuple)
- buffer对象
- xrange对象
序列类型均可采用的操作符
序列操作符 | 作用 |
seq[index] | 索引,获得下标为index的元素 |
seq[index1:index2] | 切片,获得下标从index1到index2间的值 |
seq * expr | 重复,序列重复expr次 |
seq1 + seq2 | 连接,连接序列seq1和seq2 |
obj in seq | 检查,判断obj是否包含在序列seq中 |
obj not in seq | 检查,判断obj是否不包含在seq中 |
内建函数(BIF)
内建函数str()、list()和tuple()被用在各种序列类型之间的转换,但是并没有做任何的类型转换,这些转换实际上工厂函数,将对象作为参数,并将其内容(浅)拷贝到新的对象中。
1. 序列类型转化工厂函数
函数 | 含义 |
str(obj) | 把obj对象转换成字符串(对象的字符串表示) |
basestring() | 抽象工厂函数,作用仅是为str和unicode函数提供父类,不能被实例化,也不能被调用 |
list(iter) | 把可迭代的对象转换成列表 |
tupel(iter) | 把可迭代的对象转换成元组 |
unicode(obj) | 把对象转换为Unicode字符串(使用默认编码) |
- 这里的转换不是简单的对象转换,因为在python中一个对象创建后,就不能再改变其身份或类型。
2. 序列类型可用的内建函数
函数名 | 功能 |
enumerate(iter) | 接收一个可迭代的对象,返回一个enumreate对象,该对象生成由index和item值组成的元组 |
len(seq) | 长度,返回序列seq的长度 |
min(iterable[,key=func]) or min(a, b, c, …[, key=func]) | 最小值,找出序列seq中的最小值;参数为序列时,用序列中的第一个元素和其他元素比较,返回最小值 |
max(iterable[,key=func]) or max(a,b,c,…[,key=func]) | 最大值,找出序列seq中的最大值;参数为序列时,用序列中的第一个元素和其他元素比较,返回最大值 |
cmp(seq1,seq2) | 判断,判断两个序列的值是否相同,根据结果返回一个整数。seq1 < seq2时,返回-1;seq1 == seq2时,返回0;seq1 > seq2时,返回1 |
sum(sequence[, start]) | 返回seq和可选参数start(默认为0)的和,效果等同于reduce() |
filter(function,list) | 把一个函数应用于序列中的每个项,并返回该函数返回真值时的所有项,从而过滤掉返回假值的所有项 |
map(function,list[,list]) | 把一个函数应用于序列中所有项,并返回一个列表 |
reduce(function,seq[,init]) | 获得序列中前两个项,并把它传递给提供的函数,获得结果后再取序列中的下一项,连同结果再传递给函数,以此类推,直到处理完所有项为止。 |
zip(seq[,seq,…]) | 把两个或多个序列中的相应项合并在一起,并以元组的格式返回它们,在处理完最短序列中的所有项后就停止。 |
切片(slice)
序列类型是其元素被顺序放置的一种数据结构类型,这样的结构类型就允许我们通过一个指定下标的方式获得序列中的数据元素,或通过在指定下标返回来获得序列的一组元素(切片操作)。
1. 访问单个元素时的操作
- 语法格式为:
seq[index]
其中,seq是序列对象,index是想要获得的元素值的索引下标。下标可以是正值,也可以是负值。索引越界会报出异常。
2. 访问多个元素时的操作(切片操作)
- 语法格式为:
- seq[start_index : end_index : step]
通过这种方式,可以实现多个元素的获取,参数均是可选的,当起始下标没有提供或者为None时,切片操作会从序列的起始位置开始,到序列的结束。
3. 详说切片操作 –> 以一个长度为十的整数序列为例
3.1 无参数的切片操作
>>> seq = range(10)
>>> print seq
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''无下标切片操作,则默认从序列的开头取到序列的结尾,即获得整个序列'''
>>> seq_1 = seq[:]
>>> print seq_1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> seq_1 = seq[] #注意[]中的:不能省略,不然会报错
SyntaxError: invalid syntax
3.2 有起始下标的切片操作
>>> print seq
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''有起始下标时,会从起始下标开始取到序列结束'''
>>> seq_2 = seq[0:] #起始下标为正数时,是从0开始的
>>> print seq_2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> seq_2 = seq[2:]
>>> print seq_2
[2, 3, 4, 5, 6, 7, 8, 9]
3.3 有结束下标的切片操作
>>> print seq
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''切片采用半开的区间,即最终结尾处的索引不包括在分片内'''
>>> seq_3 = seq[:7]
>>> print seq_3
[0, 1, 2, 3, 4, 5, 6]
>>> seq_3 = seq[:0] #用这个很好的说明切片采用半开区间
>>> print seq_3
[] #相当于没有取值
3.4 有起始和结束下标的切片操作
'''切片采用半开的区间,即最终结尾处的索引不包括在分片内'''
>>> print seq
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> seq_4 = seq[2:7]
>>> print seq_4
[2, 3, 4, 5, 6] #半开区间,所以取不到7
3.5 有负数下标的切片操作
'''索引可以为负数,索引以-1开始,从右到左,逐步减小'''
>>> seq_5 = seq[-9:]
>>> print seq_5
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> seq_5 = seq[-1:]
>>> print seq_5
[9]
>>> seq_5 = seq[:-9]
>>> print seq_5
[0]
>>> seq_5 = seq[-7:-2]
>>> print seq_5
[3, 4, 5, 6, 7] #依旧是半开区间,取不到-2对应的值(8)
3.6 有步长的切片操作
>>> '''步长,扩展了切片的功能'''
>>> print seq
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> seq_6 = seq[::-1] #实现序列的翻转
>>> print seq_6
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> seq_6 = seq[::2] #通过跳一个,取一个,来实现获得偶数序列
>>> print seq_6
[0, 2, 4, 6, 8]
在使用切片操作时,要注意与列表的区别