2

ジェネレーターを反復する for ループがあり、このループで後で使用するリストを作成しているとします。

q = []
for index, val in enumerate(['a', 'b', 'c']):
    q.append(index+val)

このような関数を作成せずにジェネレーターを保持したい:

def foo(gen):
    for index, val in gen:
        yield index+val

それはまったく可能ですか、それともここには見られない固有の問題がありますか?
次のようになるはずです。

iter_q = something()
for index, val in enumerate(['a', 'b', 'c']):
    q.add_iteration(index+val)

OK、これを書いたので、これはまったく不可能 (または役に立たない) ように思えます。なぜなら、この for ループは、「ジェネレーター」の準備が整う前にリスト全体を反復処理する必要があるためです。 、オブジェクトの有用な意味でのジェネレーターではありません。

自分でそのような質問を見つけることができなかったので、とにかく投稿します。(さらに、誰かがそれについてまだ興味深いことを言っているかもしれません)

4

2 に答える 2

4

あなたの質問を正しく理解していれば、ジェネレーター式が必要になると思います:

q = (index + val for index, val in enumerate(someOtherGenerator))

このステートメントは、関数qによって返されるジェネレーターと同じようにfoo機能する新しい generator を作成します。変数に割り当てる必要もありません。関数呼び出しなど、ほぼどこでもジェネレーター式を作成できます。

doSomethingWithAGenerator(i+v for i,v in enumerate(someOtherGenerator))

ジェネレーター式で作成できない種類のジェネレーターもありますが、最も一般的な種類のジェネレーターは作成できます。

于 2012-08-08T15:50:03.620 に答える
0

私はそれをこのように見ています:itertools.cycleおそらく、それを使い果たしていないふりをしながらイテレータをループする関数のクラス最高の例です。最終的には、全体の完全なコピーが作成されます。itertoolsそれ以上のことができない場合は、おそらく他の(一般的な)解決策はありません。

于 2012-08-08T15:27:14.993 に答える