Python 切片运算符

本文详细解析了Python中切片运算的基本原理,包括如何通过__getitem__、__setitem__和__delitem__方法实现,以及如何使用slice函数与range函数之间的关联。同时,文章介绍了切片功能的扩展,比如使用步进参数、多维切片、带步进的多维切片、扩展切片分配和删除等高级应用。以字符串'abcd'为例,演示了正向索引、反向索引和默认索引的用法,并解释了长度操作符的使用。最后,文章提供了一个实用的公式和一系列实例,帮助读者更好地理解和运用Python的切片功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

先从原理上分析切片运算: 
     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 "<stdin>", 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]语句删除一个切片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值