5

重複の可能性:
Python ジェネレーター オブジェクトのクローンを作成する方法は?

ジェネレーター '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() などに相当するものはありますか?

4

2 に答える 2

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))
于 2012-12-15T23:13:02.180 に答える
1

最も簡単な答えは、リストにすることです。そうすれば、必要な動作が得られます。

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

怠惰であることによる効率の向上は、値を何度も再計算することによって失われる可能性があります。

于 2012-12-15T23:14:16.523 に答える