2012-12-15 11 views
5

可能性の重複を取得する方法:
How to clone a Python generator object?ジェネレータ関数の複数のインスタンス

は、私は発電機「stuff_to_try」を持っていると仮定し、私は1つずつそれらを試すことができますが、私は持っていた場合そのメソッドは再帰的ですが、私はそれぞれの再帰に、最後の再帰が途絶えた場所ではなく、最初のyieldで始まる新しい新しいジェネレータを取得させたいと考えています。

def solve(something): 
    if exit_condition(something): 
     return 

    next_to_try = stuff_to_try.next() 
    while not if_works(next_to_try): 
     next_to_try = stuff_to_try.next() 
    solve(do_something(something)) 

もちろん、私は再帰関数内でstuff_to_tryを定義できますが、より良い方法はありますか? stuff_to_try.clone()。reset()などと同等のものがありますか?

答えて

3

は、関数でジェネレータを定義します。

def stuff_to_try(): 
    return (i for i in [stuff, to, try]) 

その後、新しい発電をするたびに、単に関数を呼び出します。

def solve(something): 
    if exit_condition(something): 
     return 

    for next_to_try in stuff_to_try(): 
     if_works(next_to_try): 
      break 
    solve(do_something(something)) 

私が正しくあなたの質問を読んでいる場合、あなたが実際にしたいことはこれです:

def solve(something): 
    if exit_condition(something): 
     return 

    for each in [stuff, to, try]: 
     if_works(each): 
      break 
    solve(do_something(something)) 
1

最も簡単な答えはそれリスト作りで、それはあなたが望む行動があります:

stuff_to_try = [i for i in [stuff, to, try]] 

値を何度も何度も再計算することによって、遅延が発生すると効率が上がる可能性があります。

+1

問題の悪い例です生成する短い有限リストがあることを暗示しているので、リストは簡単ですが、実際の問題はジェネレータをクローンする方法です。ジェネレータがもっと複​​雑であるとします。 – xster

+2

間違いなく最も単純ですが、実用的ではない場合があります。リストがメモリに収まらない場合があります。 –

+0

もちろん、それは欠点です。つまり、手元の発電機に応じて唯一の実用的な解決策になるかもしれません。 –

関連する問題