在 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]