在 Python 中,slice()函数用于创建一个切片对象,该对象可以用于对序列进行切片操作。

函数语法

slice([start,] stop[, step])
  • start:可选,切片的起始位置(包含),默认为0
  • stop:必须,切片的结束位置(不包含);
  • step:可选,表示步长,默认为1

slice()函数返回一个切片对象,该对象可以传递给序列(如字符串、列表或元组)的切片操作符[]

slice()函数示例

创建简单的切片对象:

s1 = slice(3)
s2 = slice(2, 5)
s3 = slice(3, 8, 2)

data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 等同于 data[0:3]
print(data[s1])   # [0, 1, 2]
# 等同于 data[2:5]
print(data[s2])   # [2, 3, 4]
# 等同于 data[3:8:2]
print(data[s3])   # [3, 5, 7]

切片对象的常用属性:

s = slice(2, 10, 3)

# 起始位置
print(s.start) # 2
# 结束位置
print(s.stop)  # 10
# 步长
print(s.step)  # 3
# 获取实际索引
print(s.indices(5))  # (2, 5, 3)
print(s.indices(15)) # (2, 10, 3)

indices()方法将切片对象转换为可以在给定长度序列上使用的(start, stop, step)元组,自动处理边界和负索引。

让自定义类型支持切片操作:

class MySequence:
    def __init__(self,data):
        self.data = data

    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, key):
        if isinstance(key, slice):

            print(f"处理切片:{key}")
            # 使用indices方法转换成可以在给定长度序列上使用的元组
            start, stop, step = key.indices(len(self))
            
            result = []

            for i in range(start,stop,step):
                result.append(self.data[i])

            return result

        if isinstance(key, int):
            return self.data[key]
        else:
            raise TypeError("索引必须是整数或切片")


seq = MySequence(list(range(10)))
s1 = slice(5)
s2 = slice(2,5)
s3 = slice(2,5,3)

print(seq[s1])
print(seq[s2])
print(seq[s3])
print(seq[5])
print(seq[5:8])

程序输出结果

处理切片:slice(None, 5, None)
[0, 1, 2, 3, 4]
处理切片:slice(2, 5, None)
[2, 3, 4]
处理切片:slice(2, 5, 3)
[2]
5
处理切片:slice(5, 8, None)
[5, 6, 7]