Python Generator / Iterator

时间:2015-02-27 02:48:28

标签: python iterator generator

我正在努力改进我的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()

我认为应该有更优雅的方式来做这件事......我错过了什么?

1 个答案:

答案 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} })