如何立即而不是在第一次调用时运行生成器函数的初始化代码?

2024-10-02 22:23:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个生成器函数,它是这样的:

def mygenerator():
    next_value = compute_first_value() # Costly operation
    while next_value != terminating_value:
        yield next_value
        next_value = compute_next_value()

我希望初始化步骤(在while循环之前)在调用函数时立即运行,而不是只在第一次使用生成器时运行。这样做的好方法是什么?在

我之所以要这样做是因为生成器将在一个单独的线程(或进程,或任何多处理使用的东西)中运行,而且我在短时间内不会使用返回,而且初始化有点昂贵,所以我希望它在我准备使用值的同时进行初始化。在


Tags: 方法函数valuedef步骤operationnextfirst
3条回答

我需要类似的东西。这就是我降落的地方。 将生成器函数推入内部并返回其调用。在

def mygenerator():
    next_value = compute_first_value()

    def generator():
        while next_value != terminating_value:
            yield next_value
            next_value = compute_next(next_value)

    return generator()

使用itertools.chain可以相当容易地创建一个“预定时”迭代器:

from itertools import chain

def primed(iterable):
    """Preprimes an iterator so the first value is calculated immediately
       but not returned until the first iteration
    """
    itr = iter(iterable)
    try:
        first = next(itr)  # itr.next() in Python 2
    except StopIteration:
        return itr
    return chain([first], itr)

>>> def g():
...     for i in range(5):
...         print("Next called")
...         yield i
...
>>> x = primed(g())
Next called
>>> for i in x: print(i)
...
0
Next called
1
Next called
2
Next called
3
Next called
4
class mygenerator(object):
    def __init__(self):
        next_value = compute_first_value()
    def __iter__(self):
        return self
    def next(self):
        if next_value == terminating_value:
            raise StopIteration()
        return next_value

相关问题 更多 >