2012-12-15 10 views
5

Powiel możliwe:
How to clone a Python generator object?Jak dostać wiele wystąpień funkcji generującej

Załóżmy, że mam generator „stuff_to_try” Mogę spróbować je jeden po drugim, ale gdybym miał metoda, która chciała przejść przez generator, a ta metoda jest rekursywna, chcę, aby każda rekursja otrzymywała nowy generator, który zaczyna się przy pierwszym wydaniu, a nie w miejscu, w którym ostatnia rekursja została przerwana.

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)) 

Oczywiście mogę zdefiniować stuff_to_try wewnątrz funkcji rekursywnej, ale czy istnieje lepszy sposób? Czy istnieje odpowiednik stuff_to_try.clone(). Reset() czy coś takiego?

Odpowiedz

3

Definiowanie generatora w funkcji:

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

Potem za każdym razem chcesz nowy generator, po prostu wywołać funkcję.

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)) 

Jeśli czytam swoje pytanie poprawnie, co rzeczywiście chcesz to:

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

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

Najprostszą odpowiedzią jest zrobić to lista, wtedy będzie miał żądane zachowanie:

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

Wzrost wydajności spowodowany leniwością może zostać utracony przez ponowne przeliczanie wartości.

+1

oops, zły przykład w pytaniu. Lista byłaby łatwiejsza, ponieważ sugeruję, że istnieje krótka skończona lista do wygenerowania, ale prawdziwym pytaniem jest, jak klonować generatory, więc przypuśćmy, że generator jest bardziej skomplikowany. – xster

+2

Zdecydowanie najprostszy, ale czasami nie praktyczny. Lista może nie pasować do pamięci. –

+0

Oczywiście, to jest wadą. Powiedział, że może to być jedyne praktyczne rozwiązanie w zależności od generatora pod ręką. –