双发射器

时间:2014-03-13 02:48:27

标签: python iterator generator

你怎么能在python中制作一个二次发射器?

我的尝试(不起作用):

>>> def g():
...     try:
...         yield 1
...         raise StopIteration('Shot 1 exhausted')
...     finally:
...         yield 2
...         # 'Shot 2 exhausted'
...         
>>> x = g()
>>> list(x), list(x)
([1, 2], [])
# expected output ([1], [2])

1 个答案:

答案 0 :(得分:3)

iterator protocol明确禁止此:

  

协议的意图是迭代器的next()方法   引发StopIteration,它将继续在后续调用中这样做。   不遵守此属性的实现被视为已损坏。

出于这个原因,生成器语法不提供制作2-shot迭代器的方法。

如果你真的想要这样做,你就不能使用发电机:

class BrokenIterator(object):
    def __init__(self):
        self.callcount = 0
    def __iter__(self):
        return self
    def next(self):
        self.callcount += 1
        if self.callcount == 1:
            return 1
        elif self.callcount == 3:
            return 2
        else:
            raise StopIteration