【问题标题】:How to implement a generator in a Linked List class?如何在链表类中实现生成器?
【发布时间】:2018-07-22 17:48:37
【问题描述】:

我正在尝试在 Python 中实现一个简单的链接列表,并尝试使用我在其中学到的所有 Python 概念。我一直在为该类实现一个生成器。

代码:

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

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

【问题讨论】:

标签: python python-3.x python-2.7 generator


【解决方案1】:

您需要一个实例变量来维护迭代器在调用next() 之间的状态。另外,__next__ 不是生成器函数,它只是返回下一个元素,所以 not 在此处使用 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

【讨论】:

  • 谢谢,您的建议有帮助!解决了这个问题。
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2016-02-06
相关资源
最近更新 更多