使用__iter __

时间:2015-11-11 19:53:43

标签: python python-3.x

我有一个标准的二进制树,读起来像
    1
   / \
2 3
/ \ / \
4 5 6 7

我需要通过导入我的树类来读取二叉树,创建这个树,然后使用for循环来读取它:[4,2,5,1,6,3,7]

我已经创建了树,我的程序将生成一个包含任意数量的树。我的问题在于方法。

def iter (自我):

到目前为止,我有:

def __iter__(self):
    if self.left:
        self.left.__iter__()
    yield self
    if self.right:
        self.right.__iter__()

但是当我在树对象上运行for循环时,如:

表示树中的项目:     print(“{}:{}”)。format(item.name,item.height())

它只打印我尝试中具有正确高度的第一个节点。

我的问题基本上是,如何使用递归打印这个二叉树?

3 个答案:

答案 0 :(得分:7)

在Python> = 3.3中,可以使用def __iter__(self): if self.left: yield from self.left yield self if self.right: yield from self.right 语法进行递归迭代:

exslt:node-set('default value') | @IfThisNodeExists

编辑:Python 3.3支持确认。

答案 1 :(得分:0)

没试过,但可能更像是:

def __iter__(self):
    if self.left:
        for k in self.left:
            yield k
    yield self
    if self.right:
        for k in self.right:
            yield k

但请先检查一下。

答案 2 :(得分:0)

集合中的下一个元素应由__next__() 返回What is the interface for python iterators?

__iter__()应该返回一个迭代器,一个定义__next__()方法的对象。 yield在生成器中使用,它与迭代器的概念完全不同,但你可以使用生成器函数(因为它是迭代器),即:

class A:
    def __init__(self, val, a=None, b=None):
        self.left = a
        self.right = b
        self.val = val

    def __iter__(self):
        def generator():
            if self.left:
                for leaf in self.left:
                    yield leaf
            yield self
            if self.right:
                for leaf in self.right:
                    yield leaf
        return generator()

for i in A(3, A(5, A(2), A(1)), A(4)):
    print(i.val)