2010-08-30 63 views
0

我有一個類,其中每個實例是一堆嵌套列表的基本上,每個 的持有數的整數或含整數的另一個列表或列表的 列表等,像這樣:爲什麼不會遞歸生成器工作?

class Foo(list): 
    def __init__(self): 
     self.extend(
      list(1), list(2), list(3), range(5), [range(3), range(2)] 
      ) 

我想定義一個方法來遍歷嵌套列表,並給我一次一個整數 ,與os.walk沒有什麼不同。我試過這個:

def _walk(self): 
    def kids(node): 
     for x in node: 
      try: 
       for y in kids(x): 
        yield y 
      except TypeError: 
       yield x 
    return kids(x) 

但它立即引發了一個stopiteration錯誤。如果我添加一個打印語句來打印第一個for循環中的每個「節點」,該函數似乎以我想要的方式遍歷整個容器,但不會產生每個節點。它只是在我第一次撥打發電機上的next時打印出來。

我很難過。請幫忙!

+0

是你的類的一個實例變量(以及一個局部變量)? – 2010-08-30 17:08:15

+1

'return kids(x)'會給出'NameError'! – 2010-08-30 17:10:28

+1

'self.extend(list(1),list(2),list(3),range(5),[range(3),range(2)])'也沒有意義。如果你想編寫僞代碼,那很好,但是不要讓它看起來像真正的Python代碼! – 2010-08-30 17:12:39

回答

1

如果你改變return kids(x)回到kids(self)

+0

你太棒了;我很愚蠢。謝謝! – twneale 2010-08-30 21:09:48

1

這裏是一個函數,你_walk方法的一個簡化版本,你想要的任意迭代什麼它的工作原理。內部kids功能不是必需的。

def walk(xs): 
    for x in xs: 
     try: 
      for y in walk(x): 
       yield y 
     except TypeError: 
      yield x 

這可能很容易適應作爲您的Foo對象的方法。

+0

良好的通話。謝謝。 – twneale 2010-08-30 21:10:12