Python 下一步(iterable)有效,但';对于';循环只会创建一个无限循环

Python 下一步(iterable)有效,但';对于';循环只会创建一个无限循环,python,class,iteration,nodes,Python,Class,Iteration,Nodes,我试图递归地遍历我所有的节点,但是我得到了一个无限循环 类别字典: #启动类节点################################################ 类节点: 定义初始化(自、键、值): self.key=key 自我价值=价值 self.nextNode=None def插入(自身、键、值): 如果self.nextNode为None或keyself.nextNode.key: self.nextNode.insert(键,值) 其他: 通过 定义(自我): 如果

我试图递归地遍历我所有的节点,但是我得到了一个无限循环


类别字典:
#启动类节点################################################
类节点:
定义初始化(自、键、值):
self.key=key
自我价值=价值
self.nextNode=None
def插入(自身、键、值):
如果self.nextNode为None或keyself.nextNode.key:
self.nextNode.insert(键,值)
其他:
通过
定义(自我):
如果self.nextNode为无:
回归自我
其他:
返回self.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
定义下一个(自我):
返回self.nextNode
定义(自我):
返回f'{self.key}:{self.value}'
#结束类节点################################################
定义初始化(自):
自身。\头部=无
def插入(自身、键、值):
如果self.\u head为None或keyself.\u head.key:
self.\u head.insert(键,值)
其他:
通过
定义(自我):
返回自我
定义(自我):
返回str(自身头)
d=字典()
d、 插入(2,2)
d、 插入(3,3)
d、 插入(4,4)
d、 插入(5,5)
当我这样做时:

p = iter(d)
print(p)
print(next(p))
print(next(next(p))
这很有效,但当我这么做的时候

for i in p:
    print(i)
我得到一个无限循环,打印3。它甚至不跳节点

for循环不是和执行iter()然后多次使用next()直到达到一个条件(无)一样吗?我不应该得到同样的东西吗?我做错了什么?

您的测试代码:

p = iter(d)
print(p)
print(next(p))
print(next(next(p)))
不是for循环中发生的事情

这更像是这样:

it = iter(d)
print(next(it))
print(next(it))
... 
class NodeIter:
    def __init__(self, start):
        self.cur = start
    def __iter__(self):
        return self
    def __next__(self):
        if self.cur is None:
            raise StopIteration()
        x = self.cur
        self.cur = x.nextNode
        return x
使用您的类,这将一遍又一遍地为您提供相同的元素


迭代器是一个对象,您可以反复调用
next
,它为您提供一系列元素,直到它引发异常以表示它已完成。您的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它不会引发异常,因此没有迭代完成的信号

如果要显式编写迭代器,则需要创建并更新一个对象,该对象跟踪迭代完成的程度,可以是这样的:

it = iter(d)
print(next(it))
print(next(it))
... 
class NodeIter:
    def __init__(self, start):
        self.cur = start
    def __iter__(self):
        return self
    def __next__(self):
        if self.cur is None:
            raise StopIteration()
        x = self.cur
        self.cur = x.nextNode
        return x
然后在你的字典里你会有:

    def __iter__(self):
        return NodeIter(self.__head)

或者,这里有一种快速编写
\uuuuu iter\uuuu
的方法,可以遍历所有节点:

def __iter__(self):
    cur = self.__head
    while cur is not None:
        yield cur
        cur = cur.nextNode

这是一种使用yield语句生成序列的简单方法。

迭代器是一个对象,您可以反复调用
next
,它会给您一个元素序列,直到它引发异常以表示它已完成。您的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它不会引发异常,因此没有迭代完成的信号。为什么我们会在帖子中看到init、str和insert这两个方法?请编辑并清理代码See@azro主要问题是:为什么一个类在另一个类的上下文中定义?这太不寻常了。谢谢你,为什么没有下一种方法,这个方法就行了?我认为iter只是拒绝任何没有下一个的东西?当生成器函数被执行时,Python会用适当的方法为您创建一个迭代器。发电机是一条捷径。看见