Python 从迭代器返回,然后抛出StopIteration
当迭代器耗尽时,最后一次从迭代器返回内容的好方法是什么。我用的是国旗,但这很难看:Python 从迭代器返回,然后抛出StopIteration,python,iterator,stopiteration,Python,Iterator,Stopiteration,当迭代器耗尽时,最后一次从迭代器返回内容的好方法是什么。我用的是国旗,但这很难看: class Example(): def __iter__(self): self.lst = [1,2,3] self.stop = False # <-- ugly return self def next(self): if self.stop: # <-- ugly
class Example():
def __iter__(self):
self.lst = [1,2,3]
self.stop = False # <-- ugly
return self
def next(self):
if self.stop: # <-- ugly
raise StopIteration
if len(self.lst) == 0:
self.stop = True
return "one last time"
return self.lst.pop()
类示例():
定义(自我):
self.lst=[1,2,3]
self.stop=False#也许您可以使用生成器函数:
def example():
lst = [1, 2, 3]
while lst:
yield lst.pop()
yield 'one last time'
你可以这样做:
class Example():
def __iter__(self):
self.lst = [1, 2, 3]
return self
def next(self):
try:
return self.lst.pop()
except IndexError:
print "done iterating"
raise StopIteration
>>> for i in Example():
... print i
...
3
2
1
done iterating
在您的实际代码中,您可能需要更改正在捕获的异常类型,但此格式仍然适用。您可以从\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中生成异常类型,将其转换为生成器函数(或者您可以按照Dan的建议编写生成器函数)。作为警告,这可能会误导滥用next
方法的人
class Example():
def __iter__(self):
lst = [1,2,3]
for i in reversed(lst):
yield i
yield "one last time"
不要再多退一件东西。这是个坏主意,因为它扩展得不好。如果你既想数数又想求和呢?还是数数和散列?迭代器是有状态对象。利用这一点
class Example( collections.Iterator ):
def __iter__(self):
self.lst = [1,2,3]
self.count = 0
return self
def next(self):
if self.lst:
self.count += 1
return self.lst.pop()
raise StopIteration()
像这样使用它
my_iter= iter(Example())
for item in my_iterprin:
print( item )
print( my_iter.count )
请记住,如果您不能或不想直接使用生成器,您可以将对象的\uuu iter\uuuu
方法本身设置为生成器函数。谢谢,“yield”是我错过的。我不能这样做,因为我不控制调用代码(这是一个wsgi应用程序)。我不控制调用代码?这很少是真的。给他们打电话,和他们交谈。