MST

星途 面试题库

面试题:Python切片与索引在复杂场景下的应用及原理探究

在Python中,切片操作 `s = 'abcdef'[1:4:2]` 会返回 `'bd'`。现在假设我们自定义一个类 `MySequence`,它实现了序列协议(`__len__` 和 `__getitem__` 方法)。请在 `MySequence` 类中实现 `__getitem__` 方法,使得当对 `MySequence` 的实例进行切片操作时,不仅能正确返回切片结果,而且在切片步长为负数时,能够按照预期的顺序反向获取元素。同时,解释Python原生切片在处理步长为负数时是如何确定起始、结束位置以及方向的原理。
40.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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原生切片处理负数步长原理

  1. 起始位置:当步长 step 为负数时,如果 startNone,则默认 start 为序列的最后一个元素的索引,即 len(seq) - 1。如果 start 给定且为负数,那么它会从序列末尾开始计数,例如 -1 表示最后一个元素, -2 表示倒数第二个元素。
  2. 结束位置:当步长 step 为负数时,如果 stopNone,则默认 stop-1,表示切片到序列的第一个元素之前(不包括第一个元素)。如果 stop 给定且为负数,同样从序列末尾开始计数。
  3. 方向:步长为负数表示切片方向是从后向前。切片操作会从 start 位置开始,按照 step 的步长,反向获取元素,直到到达 stop 位置(但不包括 stop 位置的元素)。