[关闭]
@songying 2018-07-14T12:11:31.000000Z 字数 805 阅读 1182

python 切片

python高级特性


参考: 《流畅的python》 2.4

python中, 列表,元组,字符串都支持切片。

为什么切片和区间会忽略最后一个元素 ?

  1. 当只有最后一个位置信息时,我们也可以快速看出切片和区间里有几个元素:range(3) 和 my_list[:3] 都返回 3 个元素。
  2. 当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去第一个下标(stop - start)即可。
  3. 这样做也让我们可以利用任意一个下标来把序列分割成不重叠的两部分,只要写成 my_list[:x] 和 my_list[x:] 就可以了

对对象进行切片

  1. s[a:b:c] # s在a和b之间以c为间隔取值,c可为负,意味着反向取值

对 seq[start:stop:step] 进行求值的时候,Python 会调用seq.__getitem__(slice(start, stop, step))

多维切片和省略

在numpy中可以出现以下几种切片

  1. a[i,j], a[m:n, k:l]

要正确处理这种 [] 运算符的话,对象的特殊方法 __getitem____setitem__ 需要以元组的形式来接收a[i, j] 中的索引。也就是说,如果要得到 a[i, j] 的值,Python 会调用 a.__getitem__((i, j))

Python 内置的序列类型都是一维的,因此它们只支持单一的索引,成对出现的索引是没有用的。

省略号

实际上是Ellipsis对象的别名,而 Ellipsis 对象又是 ellipsis 类的单一实例,它可以当作切片规范的
一部分,也可以用在函数的参数清单中,比如 f(a, ..., z),或 a[i:...]

  1. ... # 这是英语句号,

给切片赋值

如果赋值的对象是一个切片,那么赋值语句的右侧必须是个可迭代对象。即便只有单独一个值,也要把它转换成可迭代的序列。

  1. l[3::2] = [11, 22]
  2. del l[5:7]

相关的特殊方法

__getitem__

__setitem__

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注