当我尝试像下面的示例中那样反转迭代器时,实际上将结果打印了两次:
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才能使迭代器正常工作。为什么会这样呢?
答案 0 :(得分:6)
使用>> df['boolean_column'].values.sum() # True
3
>> (~df['boolean_column']).values.sum() # False
2
时,self.idx -= 1
会经过值self.idx
,2, 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
可能已经透露了您的情况。