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应用程序)。我不控制调用代码?这很少是真的。给他们打电话,和他们交谈。