Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84040
  • 博文数量: 20
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-17 16:15
文章分类

全部博文(20)

文章存档

2013年(20)

我的朋友

分类: Python/Ruby

2013-04-05 21:10:22

原文地址:Python 切片运算符 作者:xu_liuzhen

先从原理上分析切片运算: 
     list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数。而slice函数又是和range()函数相关的。
给切片传递的键是一个特殊的slice对象。该对象拥有可描述所请求切片方位的属性,例如:
   a = [ 1, 2, 3, 4, 5, 6 ]
   x = a [ 1 : 5 ]                                       #  x = a.__getitem__( slice ( 1, 5, None ) ) 
   a [ 1 : 3 ] = [10, 11, 12 ]                       #  a.__setitem__( slice ( 1, 3, None ), [ 10, 11, 12 ] )
   del a [ 1 : 4 ]                                        #  a.__delitem__( slice ( 1, 4, None ) )
   Python 的切片功能实际上比很多程序员认为的更强大。例如,它支持以下扩展切片的变体,在处理像矩阵和数组这样的多维数据结构的时候可能非常有用:
   a = m [ 0 : 100 : 10 ]                            #  带步进的切片(步进值=10)
   b = m [ 1 : 10, 3 : 20 ]                          #  多维切片
   c = m [ 0 : 100 : 10, 50 : 75 : 5 ]            #  带步进值的多维切片
   m [ 0 : 5, 5 : 10 ] = n                             #  扩展切片分配
   del m [ : 10, 15 : ]                                  #  扩展切片删除

      扩展切片每个维度的一般格式是 i : j [ : stride ], stride 时可选的。和普通切片一样,可以省略切片每个部分的开始或者结束值。另外,省略号(...)可用于表示宽展切片中结束或者开始的任意维数:
   a = m [ ..., 10 : 20 ]                                  #   使用 Ellipsis 对象访问扩展切片
   m rfg[ 10 : 20, ... ] = n
   使用扩展切片时,__getitem__(), __setitem__()和__delitem__()方法分别用于实现访问、修改和删除操作。然而,传递给这些方法的值是一个包含slice或Ellipsis对象组合的元组,而非整数,例如:
   a = m [ 0 : 10, 0 : 100 : 5, ... ]
  调用__getitem__()方法的方式如下:
   a = m.__getitem____( ( slice ( 0, 10, None ), slice ( 0, 100, 5 ), Ellipsis ) )

下面具体介绍用法:
切片( [ ] 和 [ : ] )
正向索引
反向索引
默认索引
接下来以字符串'abcd'为例子.表里面分别列出了使用正索引和负索引来定位字符的情况.
可以用长度操作符来确认该字符串的长度是 4:
>>> aString = 'abcd'
>>> len(aString)
4
Edit By Vheavens                                                             
Edit By Vheavens 
正向索引时,
索引值开始于 0,结束于总长度减 1(因为我们是从 0 开始索引的).本例中最后
一个索引是:
final_index = len(aString) - 1
= 4 - 1
= 3
在这个范围内,我们可以访问任意的子串。用一个参数来调用切片操作符结果是一个单一
字符,而使用一个数值范围(用':')作为参数调用切片操作的参数会返回一串连续地字符.再强
调一遍,
对任何范围[start:end],我们可以访问到包括 start 在内到 end(不包括 end)的所有字
符,换句话说,假设 x 是[start:end]中的一个索引值,那么有: start<= x < end.
>>> aString[0]
'a'
>>> aString[1:3]
'bc'
>>> aString[2:4]
'cd'
>>> aString[4]
Traceback (innermost last): File "", line 1, in ?
IndexError: string index out of range
使用不在允许范围(本例中是 0 到 3)内的索引值会导致错误。上面的 aString[2:4]却并没
有出错,那是因为实际上它返回的是索引值 2 和 3 的值。但是直接拿 4 作为索引访问是不被允
许的。
在进行反向索引操作时,是从-1 开始,向字符串的开始方向计数,到字符串长度的负数为
索引的结束。最末一个索引(也就是第一个字符)是这样定位的:
final_index
= -4
= -len(aString)
>>> aString[-1]
'd'
>>> aString[-3:-1]
'bc'
>>> aString[-4]
'a'
Edit By Vheavens                                                             
Edit By Vheavens 
如果开始索引或者结束索引没有被指定,则分别以字符串的第一个和最后一个索引值为
默认值。
>>> aString[2:]
'cd'
>>> aString[1:]
'bcd'
>>> aString[:-1]
'abc'
>>> aString[:]
'abcd'
注意:起始/结束索引都没有指定的话会返回整个字符串.

前几天在书上看到个公式很好用:s[n]=s[n-len (s)] (n为正数) 或者 s[n]=s[len(s)+n] (n为负数)

   1 s=[1,2,3,4]               # S 上界为 0 下界为 4 
   2 print s[-100:100]       #返回 [1,2,3,4] -100超出了上界,100超出了下界:等价于 s[0:4]
   3 print s[-100:-200]      #返回 [] -100,-200均超出了上界,自动取上界:等价于s[0:0]
   4 print s[100:200]        #返回 [] 100,200均超出了下界,自动取下界值:等价于s[4:4]

s[i] = x操作将列表索引为 i 的元素重新赋值为对象 x ,并增加 x 的引用记数。如果i是负数,在求值之前,就先执行 i+=len(s),计算结果必须是一个小于len(s)的非负整数。尝试给一个不存在的索引赋值会引发 IndexError 异常. 切片分配操作符 s[i:j] = r 将列表片段s[i:j]替换为序列 r。如:

   1 a = [1,2,3,4,5]
   2 a[1] = 6            # a = [1,6,3,4,5]
   3 a[2:4] = [10,11]    # a = [1,6,10,11,5]
   4 a[3:4] = [-1,-2,-3] # a = [1,6,10,-1,-2,-3,5]
   5 a[2:] = [0]         # a = [1,6,0]
del s[i]语句从列表s中删除元素i,并将它的引用记数减1。del s[i:j]语句删除一个切片。


阅读(925) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~