从迭代器返回然后抛出StopIteration

geo*_*org 6 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
            raise StopIteration
        if len(self.lst) == 0:
            self.stop = True            
            return "one last time"
        return self.lst.pop()
Run Code Online (Sandbox Code Playgroud)

背景:我从外部源获取未知数量的字符串,并将它们进一步发送给调用者.当进程结束时,我想发出一个字符串"x records processed".我无法控制调用代码,所以这必须在我的迭代器中完成.

zee*_*kay 6

您可以__iter__从中将其转换为生成器函数(或者您可以按照Dan的建议编写生成器函数).正如警告一样,这可能会误导滥用该next方法的人.

class Example():

    def __iter__(self):
        lst = [1,2,3]
        for i in reversed(lst):
            yield i
        yield "one last time"
Run Code Online (Sandbox Code Playgroud)


Dan*_*son 5

也许您可以使用生成器函数:

def example():
    lst = [1, 2, 3]
    while lst:
        yield lst.pop()
    yield 'one last time'
Run Code Online (Sandbox Code Playgroud)

  • 请记住,在您不能或不想直接使用生成器的情况下,您可以使对象的`__iter__`方法本身成为生成器函数. (3认同)