这一章是将序列的,首先介绍所有序列共有的性质和函数(虽然字符串不是序列,但由于其和列表,元组有一些类似地方,故也在这里面讲述),然后介绍字符串,列表,元组。这是一大章,因此我将它分成3个小部分。先讲序列,再是字符串,列表和元组。
序列类型是其元素被顺序放置的一种数据结构类型。可以用下标的方式访问其中的一个元素,也可以用切片的方式访问其中一串元素。
下面是对所有序列类型都适用的操作符。 从上到下优先级依次为从高到低。
seq[ind]:获得下标为ind的元素
seq[ind1:ind2]:获得下标在ind1和ind2之间的元素
seq*expr:序列重复expr次,expr的计算结果必须为整型(而且不能是长整型)
seq1+seq2:连接序列seq1和seq2,该操作效率不高,字符串的连接可以用join函数,列表可以用extend()函数。
obj in seq:判断obj元素是否包含在seq中
obj not in seq:判断obj元素是否不包含在seq中
其实上面最容易困惑的是seq[ind1:ind2]。其扩展形式为seq[begin:end:step]。首先是关于序列的编号。
0 1 2 3 N-1
a = [0, 1, 2, 3, ……, N-1]
-N -(N-1) -(N-2) -1
在seq[ind]形式中ind必须属于0~N-1, 或属于-N~-1。 (N是序列元素个数)
在seq[begin:end:step]形式中step不能为0。step可以省略,默认为1, begin和end也可以省略。
对于上面的a,例子: a[-(N-1):3] == [1, 2],就是这个范围内的数,注意不包括a[3]。
即seq[begin:end:step]包含begin到end之间的元素,不包含seq[end],但包含seq[begin],step是步长。
关于切片里面难弄的是begin和end省略的形式,如果没提供begin和end就以序列的最开始处为开始,最末尾处为末尾。那么这句话其实是没说很清楚的。看下面的例子。
In [4]: a = [0, 1, 2, 3]
In [5]: a[:]
Out[5]: [0, 1, 2, 3] # 注意这里的输出包含了最后一个数字3
In [6]: a[3:] # 既然结束位置为最末尾的位置,那这应该相当于a[3:3],但却不是,a[3:3]为空
Out[6]: [3]
其实这里最末位置应该是序列的长度(最后一个元素的后一个位置),因此a[3:]等价与a[3:4]
其实也可以这么看,如果不指定begin或end时,seq[begin:end]就包含seq[end]这个元素。
看下面这个:
In [13]: a[0::-1]
Out[13]: [0] # 体会下当step为负数时会发生什么。
关于这些目前我也不算是特别清楚,只是大概感觉知道怎么回事了。关于切片不知道标准里面有无具体的语法规则。
序列本身包含着迭代的概念。能在循环中迭代的称为“可迭代对象”,这个在后面才细说。
一些内建函数(工厂函数和功能函数)
(1) 工厂函数:
list(iter):将可迭代对象转换为列表。
str(obj):将obj对象转换为字符串
unicode(obj):将obj对象转换为unicode字符串
basestring():str和unicode的父类,不能实例化,不能调用。
tuple(iter):将可迭代对象转换为元组。
这里广泛用到词语“转换”,其实这是错觉,python不会去进行对象转换,因为对象的身份和类型都不能改变的。比如int(23.4)得到23,好像是把浮点数转换成了整型,其实是根据这个浮点数新生成了一个整型对象。
而且在这里list()和tuple()都是建立了一个对象的浅拷贝。具体见下例:
In [16]: b = [1, 2]
In [17]: a = ('i', b, 'c')
In [18]: c = list(a)
In [19]: c
Out[19]: ['i', [1, 2], 'c']
In [20]: b[0] = 3
In [21]: c
Out[21]: ['i', [3, 2], 'c'] # 修改b中的元素后c中的元素值也发生了变化,因为拷贝只拷贝了对象的索引。
如果换成深拷贝就不会出现上面的情况。
(2) 功能函数:参数seq表明只能以序列为参数,iter表示参数可以为可迭代对象。
enumerate(iter):返回一个enumerate对象,该对象生成由iter每个元素的index值和item值组成的元组
len(seq):返回序列的长度
max(iter, key=None) 或 max(arg0, arg1,..., key=None):返回iter或(arg0, arg1,...)中的最大值,key必须为一个可以传给sort()的方法,用于比较的回调函数。
min(iter, key=None)或min(arg0, arg1,..., key=None):同max
reversed(seq):返回以逆序访问的迭代器。
sorted(iter, func=None, key=None, reverse=False):返回一个有序列表,fun,key,reverse和list.sort()内建函数的参数含义相同。
sum(seq, init=0):返回seq和init参数的总和。
zip([it0, it1, ...itN]):返回一个列表,其中第一个元素为it0,it1,..itN的第一个元素组成的元组,依此类推。
记住切片的方式和浅拷贝。
阅读(1322) | 评论(0) | 转发(0) |