我正在努力改进我的python并加快发电机的速度。我有一个对象,我正在处理一系列事件。我希望按顺序和各种方法提取事件列表。我想为此目的使用生成器(我知道如果没有它们我可以写其他东西)。
以下是我一直在处理的示例代码:
def _get_next_event():
def gen():
for i,event in enumerate(range(1,10)):
yield event
iterator = gen()
def run():
return iterator
run.next = iterator.__next__
return run
t = _get_next_event()
t.next()
for x in t():
if x < 5:
print(x)
else:
break
t.next()
这让我可以对事件进行for循环,也可以通过函数的下一个方法单独拉下一个事件。
我在课堂上实现这个,看起来像这样:
def _get_next_event(self):
def gen():
print(self.all_sessions)
for event in self.all_sessions:
yield event['event']
iterator = gen()
def run():
return iterator
run.next = iterator.__next__
return run
但是,在它在类中工作之前我必须运行它,例如在for循环之前我有其中一个:
self._get_next_event = self._get_next_event()
我认为应该有更优雅的方式来做这件事......我错过了什么?
答案 0 :(得分:1)
通常,生成器......不是那样写的。
通常,您只需在顶级功能中使用yield
:
def _get_next_event():
for i,event in enumerate(range(1,10)):
yield event
然后你可以写下这个:
for event in _get_next_event():
# do something with event
也许你有一些理由按照你所展示的方式去做,但是这个原因在你发布的代码中并不明显。
(为了记录,我假设您的生成器字面上看起来像那样,或者我告诉您将整个函数体更改为{{1} })