J'ai écrit une classe d'arbres en Python, mais j'avoir des problèmes en créant dans iterator pour elle je veux être en mesure de faireITERATE (dans un arbre Python)
phonebook = MyTree()
# Build up tree
for node in phonebook:
print "%s: %s" % (node.key(), node.data())
Mais cela ne fonctionne pas (dit que l'objet générateur n'a pas de clé() et de donnée()). La fonction __iter__
de ma classe Tree retourne une classe d'itérateur que j'ai créée. Voici ce que j'ai jusqu'ici (je sais que c'est faux et ça ne marche pas car il retourne un objet générateur, puisque c'est ce que fait le rendement, je veux qu'il se souvienne où il était dans la récursivité ... donc je ne peux pas utiliser return) . Fondamentalement, je veux juste retourner les nœuds en ordre.
class TreeIterator():
def __init__(self, root, size):
self._current = root
self._size = size
self.num_visited = 0
def __iter__(self):
return self
def next(self):
return self._next(self._current)
def _next(self, curr):
self.num_visited = self.num_visited + 1
if self.num_visited == self._size:
raise StopIteration
if curr.left is not None and curr.left is not TreeNode.NULL:
yield self._next(curr.left)
yield curr
if curr.right is not None and curr.right is not TreeNode.NULL:
yield self._next(curr.right)
Cela a fonctionné, j'ai déjà vu cela avant mais je ne pouvais pas le faire fonctionner alors. Pouvez-vous expliquer pourquoi cela fonctionne? Je ne comprends toujours pas x pour self_next (curr.left). – robev