Почему реверсивный итератор требует индекса до минус 2 вместо 1? - PullRequest
0 голосов
/ 21 ноября 2018

Когда я пытаюсь повернуть итератор, как в примере ниже, я получаю результаты, напечатанные дважды:

class TestIterator:

  def __init__(self):
    self.list = ['Alice', 'Bob', 'Charlie']

  def __iter__(self):
    self.idx = len(self.list) - 1
    return self

  def __next__(self):
    try:
      res = self.list[self.idx]
    except IndexError:
      raise StopIteration
    self.idx -= 1
    return res

names = TestIterator()

for name in names:
  print(name)

Результат:

Charlie
Bob
Alice
Charlie
Bob
Alice

InВ результате выше, имена печатаются дважды.Я бы ожидал, что он будет печататься следующим образом:

Charlie
Bob
Alice

Однако, как ни странно, после того, как я немного поковырялся, я заметил, что если бы у меня было self.idx -= 2, он печатал только один раз, но последовательностьвсе еще не так.Пример:

...
  def __next__(self):
    try:
      res = self.list[self.idx]
    except IndexError:
      raise StopIteration
    self.idx -= 2
    return res
...

Это печатает:

Charlie
Alice
Bob

Я не понимаю, почему я должен минус 2 по индексу для правильной работы итератора.Почему так себя ведет?

1 Ответ

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

Когда вы используете self.idx -= 1, self.idx проходит через значения 2, 1, 0, -1, -2, -3, -4 с IndexError в -4.-1, -2, -3 - все действительные индексы в Python.

Когда вы используете self.idx -= 2, self.idx проходит через значения 2, 0, -2, -4.Таким образом, он печатает только три значения, но в неправильном порядке.

Не используйте except IndexError для этой цели, используйте if self.idx < 0 или что-то еще.

Также получите привычку к отладкеваша программа с print заявлениями.print(self.idx), вероятно, показал бы, что с тобой происходит.

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