为什么反向迭代器要求索引为负2而不是1?

时间:2018-11-21 15:43:54

标签: python iterator

当我尝试像下面的示例中那样反转迭代器时,实际上将结果打印了两次:

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

在上面的结果中,名称被打印两次。我希望它能以这种方式打印:

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 :(得分:6)

使用>> df['boolean_column'].values.sum() # True 3 >> (~df['boolean_column']).values.sum() # False 2 时,self.idx -= 1会经过值self.idx2, 1, 0, -1, -2, -3, -4处有IndexError-4是Python中所有有效的索引。

使用-1, -2, -3时,self.idx -= 2会经过值self.idx。因此它只打印三个值,但顺序错误。

请勿为此使用2, 0, -2, -4,而应使用except IndexError之类的东西。

还养成使用if self.idx < 0语句调试程序的习惯。 print可能已经透露了您的情况。