class MySequence:
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
def __getitem__(self, index):
if isinstance(index, int):
if index < 0:
index += len(self.data)
if 0 <= index < len(self.data):
return self.data[index]
else:
raise IndexError("Index out of range")
elif isinstance(index, slice):
start, stop, step = index.start, index.stop, index.step
if start is None:
start = 0 if step > 0 else len(self.data) - 1
if stop is None:
stop = len(self.data) if step > 0 else -1
if step < 0:
start = start if start >= 0 else len(self.data) + start
stop = stop if stop >= 0 else len(self.data) + stop
return self.data[start:stop - 1 if stop >= 0 else None:step]
else:
return self.data[start:stop:step]
else:
raise TypeError("Invalid argument type")
Python原生切片处理负数步长原理
- 起始位置:当步长
step
为负数时,如果 start
为 None
,则默认 start
为序列的最后一个元素的索引,即 len(seq) - 1
。如果 start
给定且为负数,那么它会从序列末尾开始计数,例如 -1
表示最后一个元素, -2
表示倒数第二个元素。
- 结束位置:当步长
step
为负数时,如果 stop
为 None
,则默认 stop
为 -1
,表示切片到序列的第一个元素之前(不包括第一个元素)。如果 stop
给定且为负数,同样从序列末尾开始计数。
- 方向:步长为负数表示切片方向是从后向前。切片操作会从
start
位置开始,按照 step
的步长,反向获取元素,直到到达 stop
位置(但不包括 stop
位置的元素)。