繁体   English   中英

如何在链接列表类中实现生成器?

[英]How to implement a generator in a Linked List class?

我试图在Python中实现一个简单的链表,并试图使用在其中学习的所有Python概念。 我被困在为该类实现Generator上。

码:

def __iter__(self):
    return self


def next(self):
    tempNode = self.head
    while tempNode:
        yield tempNode.data
        tempNode = tempNode.nextNode
    else:
        raise StopIteration

用法:

list_gen = iter(list1)
print (next(list_gen))
print (next(list_gen))

输出:

生成器对象下一个位于0x7ff885b63960

生成器对象下一个位于0x7ff885b63960

它既不打印节点的数据值,也不维护方法的当前状态(从返回的地址可以明显看出)。

我在哪里犯错? 提前致谢。

编辑我将代码修改为:

def next(self):
    tempNode = self.head
    while tempNode:
        tempNode2 = tempNode
        tempNode = tempNode.nextNode
        return tempNode2.data
    else:
        raise StopIteration

现在,将打印节点值,但是如前所述,状态不会保留,并且每次都会打印第一个节点的值。

您需要一个实例变量来维护两次调用next()之间的迭代器状态。 此外, __next__是不是一个发电机的功能,它只是返回的下一个元素,所以不要yield有:

def __init__(self, ...):
    # ...
    self.iter_node = None  # maintain state of iterator

def __iter__(self):
    return self

def next(self):
    if self.iter_node is None  # reset iterator to allow repeated iteration
        self.iter_node = self.head or 'XXX'  # dummy for to signal end
    if self.iter_node != 'XXX':
        rval = self.iter_node.data
        self.iter_node = self.iter_node.nextNode or 'XXX'
        return rval
    else:
        self.iter_node = None
        raise StopIteration

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM