说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 内置函数 slice() 返回一个切片对象,用于切取任何序列(字符串、元组、列表、range 或字节序列等)。
以下为使用示例:
text = 'hello'
sliced = slice(3)
sliced
# slice(None, 3, None)
type(sliced)
# slice
text[sliced]
# 'hel'
语法有两种:
class slice(stop)
class slice(start, stop[, step])
参数说明:
因此,slice 对象有以上三个信息,没有指定的会为 None。如果 start 为 None,则从 0 开始。如果 step 为 None ,步长缺省为 1。
返回一个切片对象(slice object)。
+---+---+---+---+---+
| H | e | l | l | o |
+---+---+---+---+---+
0 1 2 3 4 5
-5 -4 -3 -2 -1
以上三个值必须为整数,可以为负值,表示反方向。序列索引从左从 0 开始,右从 -1 开始。
也可以直接使用 obj[start:stop:step]
索引语法进行切片操作。
切片通常只包含了特定 sequence 的一部分的对象。切片是通过使用下标标记来创建的,在 [] 中给出几个以冒号分隔的数字,例如 variable_name[1:3:5]。方括号(下标)标记在内部使用 slice 对象。
slice() 函数返回一个 slice 对象,代表由 range(start, stop, step) 指定索引集的切片。 其中参数 start 和 step 的默认值为 None。
text = 'hello'
sliced = slice(1,4, 2)
sliced
# slice(1, 4, 2)
text[sliced]
# 'el'
切片对象具有只读数据属性 start 、stop 和 step,只是返回对应的参数值(或默认值)。
# 属性
sliced.start # 1
sliced.stop # 4
sliced.step # 2
这几个属性没有其他明确的功能;不过 NumPy 和其他第三方扩展会用到。
在使用扩展索引语法时,也会生成切片对象。例如: a[start:stop:step]
或 a[start:stop, i]
。
以列表为例,内部是调用 __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))
另一种方案是返回迭代器对象,可参阅 itertools.islice() 。
以下是与切片操作 [] 的对比:
在 C 语言中,相当于:
# a[start:end:step]
for(i = start; i < end; i += step)
总结如下:
切片的语法映射到切片类的构造函数 slice,其中任何空值都由None表示。
切片对象然后被传递到适当的特殊方法中,因此 x[1:2:3] 相当于类型 type(x).__getitem__(x, slice(1, 2, 3))
。
我们可以对任何支持序列协议的对象使用 slice() 函数的操作,序列协议需要实现 __getitem__()
和 __len()__
特殊方法。
详见序列数据类型的原理。
更新时间:2023-09-17 11:59:28 标签:python 切片