1

我实现了一个(简单的)python 生成器。现在,我想做另一个(从中),它将遍历所有值,但最后一个。

def gen(x):                   # Generate the interval [x, 10]
    if x <= 10:
        yield x
        for v in gen(x + 1):
            yield v

实现这一目标的最佳方法是什么?是否可以使用装饰器更改原始生成器?

4

1 回答 1

6

使用临时变量作为简单的“队列”,您可以转发来自任何迭代器的元素并将最后一个保留在末尾:

def islice_to_last(it):
    prev_value = next(it)
    for value in it:
        yield prev_value
        prev_value = value

或更一般地(对于最多x 个最后一个元素的生成器):

from collections import deque
import itertools as it

def islice_without_end(it, x):
    d = deque(it.islice(it, x))
    for value in it:
        yield d.popleft()
        d.append(value)
于 2012-12-17T12:53:38.580 回答