当前位置: 代码迷 >> python >> 如何在链接列表类中实现生成器?
  详细解决方案

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

热度:79   发布时间:2023-07-16 11:17:24.0

我试图在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
  相关解决方案