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 に答える