2012-12-15 48 views
5

可能重複:
How to clone a Python generator object?如何獲得發電機功能的多個實例

假設我有一臺發電機「stuff_to_try」,我可以嘗試逐一但如果我一種想要通過生成器並且該方法是遞歸的方法,我想讓每個遞歸獲得一個新的新生成器,該生成器從第一個收益開始,而不是最後一次遞歸離開的地方。

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

當然,這是缺點。也就是說,這可能是唯一可行的解​​決方案,取決於手頭的發電機。 –