Python: выполнение шагов в последовательности - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь создать полностью разрезаемую последовательность Фибоначчи, и я застрял на шаге функции нарезки.Вот код, который у меня есть до сих пор:

class Fib:
    def __init__(self, start, end):
        self.start = start
        self.end = end
    def _fib(self, index):
        items = [0,1]
        n = 2
        while n <= index:
            items.append(items[n-1]+items[n-2])
            n += 1
        return items
    def __len__(self):
        return self.end - self.start
    def __reversed__(self):
        items = self._fib(self.end)
        return reversed(items)
    def __count__(self, item):
        items = self._fib(self.end)
        return items.count(item)
    def __getitem__(self, index):
        if isinstance(index, slice):
            return Fib(slice.start, slice.stop-1)
        if index > len(self):
            raise StopIteration
        if index == 0:
            return 0
        if index == 1:
            return 1
        if index < 1:
            return list(reversed(self._fib(self.end)))[abs(index)]
        items = self._fib(index)
        return items.pop()

Кажется, что он работает с регулярными срезами, обращением и индексацией по отрицательным числам.Однако, когда я пытаюсь использовать шаги, например, Fib (0, 100) [:: 2], я получаю ошибку, мне трудно интерпретировать.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "fibonacci.py", line 22, in __getitem__
    return Fib(slice.start, slice.stop-1)
TypeError: unsupported operand type(s) for -: 'member_descriptor' and 'int'

edit: я закончил делатьэто ...

class Fib:
def __init__(self, start, end):
    self.start = start
    self.end = end
def _fib(self, index):
    items = [0,1]
    n = 2
    while n <= index:
        items.append(items[n-1]+items[n-2])
        n += 1
    return items
def __len__(self):
    return self.end - self.start
def __reversed__(self):
    items = self._fib(self.end)
    return reversed(items)
def __count__(self, item):
    items = self._fib(self.end)
    return items.count(item)
def __getitem__(self, index):
    if isinstance(index, slice):
        _start, _stop, _step = (0, self.end, 1)
        if index.start is not None:
            _start = index.start
        if index.stop is not None:
            _stop = index.stop
        if index.step is not None:
            _step = index.step
        abs_stop = _stop
        abs_start = _start
        if _stop < 0:
            abs_stop = self.end + _stop
        if _start < 0:
            abs_start = self.end + _start
        _n = max(abs_start, abs_stop) - 1
        return self._fib(_n)[_start:_stop:_step]
    if index > len(self):
        raise StopIteration
    if index == 0:
        return 0
    if index == 1:
        return 1
    if index < 1:
        return list(reversed(self._fib(self.end)))[abs(index)]
    items = self._fib(index)
    return items.pop()

1 Ответ

0 голосов
/ 09 ноября 2018

Вместо этого должно быть return Fib(index.start, index.stop-1). Затем, поскольку срезы имеют None, если не предоставлено, вы должны учесть это, заменив index.start на 0, если это None, и index.stop на длину последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...