你怎么能在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])
答案 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