问题描述
我试图在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
现在,将打印节点值,但是如前所述,状态不会保留,并且每次都会打印第一个节点的值。
1楼
您需要一个实例变量来维护两次调用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