Chinaunix首页 | 论坛 | 博客
  • 博客访问: 248722
  • 博文数量: 44
  • 博客积分: 1052
  • 博客等级: 少尉
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 16:51
文章分类

全部博文(44)

文章存档

2013年(7)

2012年(14)

2011年(23)

分类: Python/Ruby

2011-02-21 20:40:28

     这一章是将序列的,首先介绍所有序列共有的性质和函数(虽然字符串不是序列,但由于其和列表,元组有一些类似地方,故也在这里面讲述),然后介绍字符串,列表,元组。这是一大章,因此我将它分成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的第一个元素组成的元组,依此类推。

     
     记住切片的方式和浅拷贝。
阅读(1284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~