9. slice对象和切片重载

什么是切片对象

切片对象(slice)是一种用于从序列类型(如列表、字符串、元组等)中提取子序列的操作。它通过指定 start、stop 和 step 参数来截取序列的一部分,

切片语法为:

序列 [start:stop:step]

示例:

lst = [1, 2, 3, 4, 5, 6, 7]
print(lst[1:6:2]  # 其中 1:6:2 就是创建切片对象

切片对象的创建

slice函数

函数
说明
slice(start=None, stop=None, step=None)
创建一个slice切片对象。

slice 对象的属性

切片运算符重载

作用

让自定义类型的对象能够支持切片操作。

索引运算符重载的方法:

方法名
运算符和表达式
说明
__getitem__(self, item)
x = self[item]
切片取值
__setitem__(self, key, value)
self[key] = value
切片的赋值
__delitem__(self, key)
del self[key]
del语句删除切片

索引和切片运算符重载使用相同的方法。

示例

# 切片运算符重载 示例

class Vector3D:
    '''用于描述三维向量的类!,x,y,z分别是向量的坐标位置!'''
    def __init__(self, x, y, z):
        self.x, self.y, self.z = x, y, z

    def __repr__(self):
        return f'Vector3D({self.x},{self.y},{self.z})'

    def __getitem__(self, item):
        print('__getitem__, item:', item)
        if isinstance(item, int):
            print('正在执行索引取值操作:')
        elif isinstance(item, slice):
            print('正在执行切片取值操作:')
            print('起始值,start:', item.start)
            print('终止值,stop:', item.stop)
            print('步长,step:', item.step)

    def __setitem__(self, key, value):
        print(f'__setitem__, key: {key}, value: {value}')

    def __delitem__(self, key):
        print(f'__delitem__, key: {key}')

v1 = Vector3D(1, 2, 3)
print('v1:', v1)
# value = v1[1:100:2]
value = v1[::2]

运行结果

v1: Vector3D(1,2,3)
__getitem__, item: slice(None, None, 2)
正在执行切片取值操作:
起始值,start: None
终止值,stop: None
步长,step: 2