在更改与其关联的变量时,如何预先设置Python生成器的状态?

时间:2015-06-26 23:24:53

标签: python

我试图通过迭代到一个叶子遍历一棵树,然后返回到根节点并迭代到下一个叶子,直到到达树的末尾。

当我将当前节点重置为root时,我的生成器表达式会重置,我该如何保留它?

class New_node(object):
    def __init__(self, data=''):
        self.data = data
        self.children = []

    def add_child(self, obj):
        self.children.append(obj)

    def child_data(self):
        return [c.data for c in self.children]

    def select_child(self, letter):
        return self.children[self.child_data().index(letter)]

    def next_child(self):
        for c in self.children:
            yield c

for c in node.child_data()
    ...
    ...
    ...
    try:
        node = node.next_child().next()
    except StopIteration:
        node = root

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你在for循环中所做的事情,但这里有一个你可以迭代的生成器方法。

def traverse(self, ancestors=list()):
    if self.children:
        for c in self.children:
            c.traverse(ancestors+[self])
    else:
        for a in ancestors:
            yield a
        yield self

答案 1 :(得分:0)

函数中的

yield语句使其成为生成器。所以next_child方法是一个生成器。生成器通常用于for循环 要从for循环中获取生成器中的下一个元素,请初始化生成器并在其上调用next函数。

child = node.next_child().next

for c in node.child_data()
    ...
    ...
    ...
    try:
        node = child()
    except StopIteration:
        node = root