2016-10-09 34 views
0

私はツリートラバーサルを実行しようとしていますが、yieldはジェネレータオブジェクトを返しますが、ジェネレータオブジェクトを反復することはできません。私は非常にPythonに新しいので、任意の助けに感謝されます。Pythonジェネレータは反復処理しません

def inorder_keys(self): 
    try: 
     if self.flag: 
      self.head = self.root 
      self.head_key = self.root_key 
      self.flag = False 
     if self.head.left is not None: 
      self.head_key = self.head.left 
      self.head = self.dict_of_keys[self.head_key] 
      BinarySearchTreeDict.inorder_keys(self) 
     else: 
      yield self.head_key 
      yield self.head.parent 
      #print(self.head_key) 
      #print(self.head.parent) 
      temp = self.head.parent 
      self.head = self.dict_of_keys[temp] 
      self.head = self.dict_of_keys[self.head.right] 
      BinarySearchTreeDict.inorder_keys(self) 
    except KeyError: 
     self.flag = True 
    pass 



try: 
    x = object01.inorder_keys() 
    print(''.join(x)) 
except Exception as e: 
    print(str(e)) 

出力:

C:\Python34\python.exe "...\output.py" 
Process finished with exit code 0 
+0

私は確信していませんので、私の推測では、あなたは 'BinarySearchTreeDict.inorder_keys(自己)のxのために:yield x'(2か所で)をしたいと思っています –

+0

私はあなたの提案を理解しています。 –

+0

私はあなたがあなたのジェネレータを非常にうまく反復していると思いますが、あなたのジェネレータのコードはバグで、あなたが望んでいるものは返されません。デバッグの助けが必要な場合は、ロジックと[mcve]の説明を提供する必要があります。 – Julien

答えて

0

だから、あなたのデータ構造は、私にはとても奇妙なようだが、ここで使用したい一般的なパターンです:

def inorder_keys(self): 
    if self.head.left is not None: 
     yield from self.head.left.inorder_keys() 
    yield self.head_key 
    if self.head.right is not None: 
     yield from self.head.right.inorder_keys() 

とIFそれはそれです私はあなたのデータ構造を正しく理解しています。

+0

ありがとうございます。これは助けとなりました。私は "収穫量"のキーワードが存在することを知らなかった。私はJavaを使用していましたが、Pythonで割り当てを提出することが必須です。 –